Compare commits

...

8 Commits

Author SHA1 Message Date
root
44ad31591c Restore vendor connector internals and configure offline packages
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
2025-10-20 15:34:24 +03:00
root
09b6a28172 Resolve Concelier/Excititor merge conflicts 2025-10-20 14:19:25 +03:00
Vladimir Moushkov
67d581d2e8 up
Some checks failed
Build Test Deploy / build-test (push) Has been cancelled
Build Test Deploy / authority-container (push) Has been cancelled
Build Test Deploy / docs (push) Has been cancelled
Build Test Deploy / deploy (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
2025-10-17 19:34:43 +03:00
Vladimir Moushkov
c8c05abb3d up
Some checks failed
Build Test Deploy / build-test (push) Has been cancelled
Build Test Deploy / authority-container (push) Has been cancelled
Build Test Deploy / docs (push) Has been cancelled
Build Test Deploy / deploy (push) Has been cancelled
2025-10-17 19:17:27 +03:00
Vladimir Moushkov
c65061602b commit
Some checks failed
Build Test Deploy / build-test (push) Has been cancelled
Build Test Deploy / authority-container (push) Has been cancelled
Build Test Deploy / docs (push) Has been cancelled
Build Test Deploy / deploy (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
2025-10-16 19:44:10 +03:00
root
0d8233dfb4 up
Some checks failed
Build Test Deploy / authority-container (push) Has been cancelled
Build Test Deploy / docs (push) Has been cancelled
Build Test Deploy / deploy (push) Has been cancelled
Build Test Deploy / build-test (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
2025-10-15 19:20:13 +03:00
Vladimir Moushkov
8d153522b0 .
Some checks failed
Build Test Deploy / build-test (push) Has been cancelled
Build Test Deploy / authority-container (push) Has been cancelled
Build Test Deploy / docs (push) Has been cancelled
Build Test Deploy / deploy (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
2025-10-15 10:05:17 +03:00
Vladimir Moushkov
ea1106ce7c up 2025-10-15 10:03:56 +03:00
1824 changed files with 200676 additions and 199636 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,76 +1,76 @@
name: Continuous Integration name: Continuous Integration
on: on:
push: push:
branches: branches:
- '**' # Trigger on all branches for commits - '**' # Trigger on all branches for commits
tags: tags:
- 'v*' # Trigger only on version tags for deployments - 'v*' # Trigger only on version tags for deployments
env: env:
Configuration: Release Configuration: Release
ContinuousIntegrationBuild: true ContinuousIntegrationBuild: true
DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true DOTNET_NOLOGO: true
jobs: jobs:
build: build:
strategy: strategy:
matrix: matrix:
os: [macos-latest, ubuntu-latest, windows-latest] os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: Build and Test name: Build and Test
steps: steps:
- name: Install libssl1.1 (restores libcrypto.so.1.1 which is required by MongoDB binaries v4.4.4) - name: Install libssl1.1 (restores libcrypto.so.1.1 which is required by MongoDB binaries v4.4.4)
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: | run: |
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt update sudo apt update
sudo apt install -y libssl1.1 sudo apt install -y libssl1.1
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Retrieve cached NuGet packages - name: Retrieve cached NuGet packages
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ~/.nuget/packages path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
- name: Restore NuGet packages - name: Restore NuGet packages
run: dotnet restore --locked-mode --verbosity normal run: dotnet restore --locked-mode --verbosity normal
- name: Build solution - name: Build solution
run: dotnet build --configuration ${{ env.Configuration }} --verbosity normal run: dotnet build --configuration ${{ env.Configuration }} --verbosity normal
- name: Run tests - name: Run tests
run: dotnet test --configuration ${{ env.Configuration }} --no-build --verbosity normal run: dotnet test --configuration ${{ env.Configuration }} --no-build --verbosity normal
publish: publish:
runs-on: macos-latest runs-on: macos-latest
needs: build needs: build
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
name: Deploy NuGet and GitHub Release name: Deploy NuGet and GitHub Release
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Restore NuGet packages - name: Restore NuGet packages
run: dotnet restore --locked-mode --verbosity normal run: dotnet restore --locked-mode --verbosity normal
- name: Build solution - name: Build solution
run: dotnet build --configuration ${{ env.Configuration }} --verbosity normal run: dotnet build --configuration ${{ env.Configuration }} --verbosity normal
- name: Create NuGet package - name: Create NuGet package
run: dotnet pack --output ./artifacts --configuration ${{ env.Configuration }} --verbosity normal run: dotnet pack --output ./artifacts --configuration ${{ env.Configuration }} --verbosity normal
- name: Upload NuGet package artifact - name: Upload NuGet package artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: mongo2go-nuget-package name: mongo2go-nuget-package
path: ./artifacts/*.nupkg path: ./artifacts/*.nupkg
- name: Publish NuGet package - name: Publish NuGet package
run: dotnet nuget push ./artifacts/*.nupkg --source https://api.nuget.org/v3/index.json --api-key "${{ secrets.NUGET_API_KEY }}" --skip-duplicate run: dotnet nuget push ./artifacts/*.nupkg --source https://api.nuget.org/v3/index.json --api-key "${{ secrets.NUGET_API_KEY }}" --skip-duplicate
- name: Create GitHub Release - name: Create GitHub Release
run: | run: |
gh release create ${{ github.ref_name }} ./artifacts/*.nupkg \ gh release create ${{ github.ref_name }} ./artifacts/*.nupkg \
--title "${{ github.ref_name }}" \ --title "${{ github.ref_name }}" \
--notes "A new release has been created. Please update the release notes manually with details about changes and improvements." \ --notes "A new release has been created. Please update the release notes manually with details about changes and improvements." \
--draft --draft
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,14 +1,14 @@
src/Mongo2Go/bin/ src/Mongo2Go/bin/
src/Mongo2GoTests/bin/ src/Mongo2GoTests/bin/
src/MongoDownloader/bin/ src/MongoDownloader/bin/
src/packages/ src/packages/
obj/ obj/
*ReSharper* *ReSharper*
*.suo *.suo
*.dotCover *.dotCover
*.user *.user
~$* ~$*
*/StyleCop.Cache */StyleCop.Cache
*.nupkg *.nupkg
**/.vs **/.vs
.idea/ .idea/

View File

@@ -1,20 +1,20 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2012-2025 Johannes Hoppe and many ❤️ contributors Copyright (c) 2012-2025 Johannes Hoppe and many ❤️ contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of 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 this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 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, the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions: subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 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 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 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. CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -1,48 +1,48 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio 15
VisualStudioVersion = 15.0.27004.2005 VisualStudioVersion = 15.0.27004.2005
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0B557702-3C09-4514-BDD5-55A44F22113F}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0B557702-3C09-4514-BDD5-55A44F22113F}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo2Go", "src\Mongo2Go\Mongo2Go.csproj", "{040A1626-1D04-40D6-BCCF-2D207AE648FC}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo2Go", "src\Mongo2Go\Mongo2Go.csproj", "{040A1626-1D04-40D6-BCCF-2D207AE648FC}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo2GoTests", "src\Mongo2GoTests\Mongo2GoTests.csproj", "{ADE5A672-6A00-4561-BCC1-E5497016DE24}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo2GoTests", "src\Mongo2GoTests\Mongo2GoTests.csproj", "{ADE5A672-6A00-4561-BCC1-E5497016DE24}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoDownloader", "src\MongoDownloader\MongoDownloader.csproj", "{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoDownloader", "src\MongoDownloader\MongoDownloader.csproj", "{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{56AB91A3-555C-4D59-BB92-570465DC2CA0}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{56AB91A3-555C-4D59-BB92-570465DC2CA0}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
README.md = README.md README.md = README.md
EndProjectSection EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{040A1626-1D04-40D6-BCCF-2D207AE648FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {040A1626-1D04-40D6-BCCF-2D207AE648FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{040A1626-1D04-40D6-BCCF-2D207AE648FC}.Debug|Any CPU.Build.0 = Debug|Any CPU {040A1626-1D04-40D6-BCCF-2D207AE648FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{040A1626-1D04-40D6-BCCF-2D207AE648FC}.Release|Any CPU.ActiveCfg = Release|Any CPU {040A1626-1D04-40D6-BCCF-2D207AE648FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{040A1626-1D04-40D6-BCCF-2D207AE648FC}.Release|Any CPU.Build.0 = Release|Any CPU {040A1626-1D04-40D6-BCCF-2D207AE648FC}.Release|Any CPU.Build.0 = Release|Any CPU
{ADE5A672-6A00-4561-BCC1-E5497016DE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ADE5A672-6A00-4561-BCC1-E5497016DE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ADE5A672-6A00-4561-BCC1-E5497016DE24}.Debug|Any CPU.Build.0 = Debug|Any CPU {ADE5A672-6A00-4561-BCC1-E5497016DE24}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ADE5A672-6A00-4561-BCC1-E5497016DE24}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADE5A672-6A00-4561-BCC1-E5497016DE24}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ADE5A672-6A00-4561-BCC1-E5497016DE24}.Release|Any CPU.Build.0 = Release|Any CPU {ADE5A672-6A00-4561-BCC1-E5497016DE24}.Release|Any CPU.Build.0 = Release|Any CPU
{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Release|Any CPU.Build.0 = Release|Any CPU {7E10E0DE-8092-4ECB-B05A-0A15472AB8D2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{040A1626-1D04-40D6-BCCF-2D207AE648FC} = {0B557702-3C09-4514-BDD5-55A44F22113F} {040A1626-1D04-40D6-BCCF-2D207AE648FC} = {0B557702-3C09-4514-BDD5-55A44F22113F}
{ADE5A672-6A00-4561-BCC1-E5497016DE24} = {0B557702-3C09-4514-BDD5-55A44F22113F} {ADE5A672-6A00-4561-BCC1-E5497016DE24} = {0B557702-3C09-4514-BDD5-55A44F22113F}
{7E10E0DE-8092-4ECB-B05A-0A15472AB8D2} = {0B557702-3C09-4514-BDD5-55A44F22113F} {7E10E0DE-8092-4ECB-B05A-0A15472AB8D2} = {0B557702-3C09-4514-BDD5-55A44F22113F}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {08364BFD-1801-4718-83F5-F6F99950B05E} SolutionGuid = {08364BFD-1801-4718-83F5-F6F99950B05E}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

File diff suppressed because it is too large Load Diff

View File

@@ -1,66 +1,66 @@
# Mongo2Go - Knowledge for Maintainers # Mongo2Go - Knowledge for Maintainers
## Creating a Release ## Creating a Release
Mongo2Go uses [MinVer](https://github.com/adamralph/minver) for versioning. Mongo2Go uses [MinVer](https://github.com/adamralph/minver) for versioning.
Releases are fully automated via GitHub Actions and triggered by tagging a commit with the desired semantic version number. Releases are fully automated via GitHub Actions and triggered by tagging a commit with the desired semantic version number.
This process involves two steps to ensure reliable deployments. This process involves two steps to ensure reliable deployments.
### Steps to Create a Release ### Steps to Create a Release
1. **Push Your Changes** 1. **Push Your Changes**
- Commit and push your changes to the main branch. This will trigger a CI build to validate the changes. - Commit and push your changes to the main branch. This will trigger a CI build to validate the changes.
```bash ```bash
git commit -m "Your commit message" git commit -m "Your commit message"
git push git push
``` ```
2. **Wait for the CI Build** 2. **Wait for the CI Build**
- Ensure that the GitHub Actions workflow completes successfully. This confirms your changes are valid. - Ensure that the GitHub Actions workflow completes successfully. This confirms your changes are valid.
3. **Tag the Commit** 3. **Tag the Commit**
- Once the CI build passes, create a lightweight tag with the desired version number - Once the CI build passes, create a lightweight tag with the desired version number
- Use an **annotated tag** to ensure the release is properly versioned and auditable (`-a` flag): - Use an **annotated tag** to ensure the release is properly versioned and auditable (`-a` flag):
```bash ```bash
git tag -a v4.0.0 git tag -a v4.0.0
``` ```
- Push the tag to trigger the deployment workflow: - Push the tag to trigger the deployment workflow:
```bash ```bash
git push --tags git push --tags
``` ```
4. **Draft Release Created** 4. **Draft Release Created**
- The workflow will: - The workflow will:
1. Create a multi-target NuGet package. 1. Create a multi-target NuGet package.
2. Publish the package to nuget.org. 2. Publish the package to nuget.org.
3. Create a **draft release** on GitHub with a placeholder note. 3. Create a **draft release** on GitHub with a placeholder note.
5. **Review and Finalize the Release** 5. **Review and Finalize the Release**
- Visit the [Releases page](https://github.com/Mongo2Go/Mongo2Go/releases). - Visit the [Releases page](https://github.com/Mongo2Go/Mongo2Go/releases).
- Open the draft release, update the release notes with details about the changes (e.g., changelog, features, fixes), and publish the release manually. - Open the draft release, update the release notes with details about the changes (e.g., changelog, features, fixes), and publish the release manually.
## Workflow Details ## Workflow Details
- **Two-Step Process**: - **Two-Step Process**:
1. The first push (commit) triggers a CI build to validate the changes. 1. The first push (commit) triggers a CI build to validate the changes.
2. The second push (tag) triggers the deployment workflow. 2. The second push (tag) triggers the deployment workflow.
- **Triggers**: - **Triggers**:
- Commits are validated for all branches. - Commits are validated for all branches.
- Tags starting with `v` trigger deployment. - Tags starting with `v` trigger deployment.
- **Draft Releases**: - **Draft Releases**:
- Releases are created as drafts, allowing maintainers to review and add release notes before publishing. - Releases are created as drafts, allowing maintainers to review and add release notes before publishing.
- **Automation**: - **Automation**:
- The workflow automates building, testing, publishing to nuget.org, and creating a draft GitHub release. - The workflow automates building, testing, publishing to nuget.org, and creating a draft GitHub release.
## Best Practices for Maintainers ## Best Practices for Maintainers
- **Semantic Versioning**: Ensure that tags follow the [semantic versioning](https://semver.org/) format (`vMAJOR.MINOR.PATCH`). - **Semantic Versioning**: Ensure that tags follow the [semantic versioning](https://semver.org/) format (`vMAJOR.MINOR.PATCH`).
- **Pre-Releases**: Use pre-release tags for non-final versions (e.g., `v4.0.0-rc.1`). - **Pre-Releases**: Use pre-release tags for non-final versions (e.g., `v4.0.0-rc.1`).
- **Detailed Release Notes**: Always add detailed information to the GitHub release, highlighting major changes, fixes, and improvements. - **Detailed Release Notes**: Always add detailed information to the GitHub release, highlighting major changes, fixes, and improvements.
- **Final Review**: Review the draft release to ensure all details are correct before publishing. - **Final Review**: Review the draft release to ensure all details are correct before publishing.

View File

@@ -1,8 +1,8 @@
{ {
"$schema": "https://json.schemastore.org/global", "$schema": "https://json.schemastore.org/global",
"sdk": { "sdk": {
"allowPrerelease": false, "allowPrerelease": false,
"rollForward": "latestMinor", "rollForward": "latestMinor",
"version": "8.0.110" "version": "8.0.110"
} }
} }

View File

@@ -1,16 +1,16 @@
#!/bin/bash #!/bin/bash
# just to be sure # just to be sure
#git clean -fdx #git clean -fdx
echo echo
echo "*** Your dotnet version:" echo "*** Your dotnet version:"
dotnet --version dotnet --version
echo echo
echo "*** Creating package:" echo "*** Creating package:"
dotnet pack --configuration Release src/Mongo2Go/Mongo2Go.csproj -p:ContinuousIntegrationBuild=true dotnet pack --configuration Release src/Mongo2Go/Mongo2Go.csproj -p:ContinuousIntegrationBuild=true
echo echo
echo "*** Package content:" echo "*** Package content:"
zipinfo src/Mongo2Go/bin/Release/Mongo2Go.*.nupkg zipinfo src/Mongo2Go/bin/Release/Mongo2Go.*.nupkg

View File

@@ -1,44 +1,44 @@
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class FileSystem : IFileSystem public class FileSystem : IFileSystem
{ {
public void CreateFolder(string path) public void CreateFolder(string path)
{ {
if (!Directory.Exists(path)) if (!Directory.Exists(path))
{ {
Directory.CreateDirectory(path); Directory.CreateDirectory(path);
} }
} }
public void DeleteFolder(string path) public void DeleteFolder(string path)
{ {
if (Directory.Exists(path)) if (Directory.Exists(path))
{ {
Directory.Delete(path, true); Directory.Delete(path, true);
} }
} }
public void DeleteFile(string fullFileName) public void DeleteFile(string fullFileName)
{ {
if (File.Exists(fullFileName)) if (File.Exists(fullFileName))
{ {
File.Delete(fullFileName); File.Delete(fullFileName);
} }
} }
public void MakeFileExecutable (string path) public void MakeFileExecutable (string path)
{ {
//when on linux or osx we must set the executeble flag on mongo binarys //when on linux or osx we must set the executeble flag on mongo binarys
var p = Process.Start("chmod", $"+x {path}"); var p = Process.Start("chmod", $"+x {path}");
p.WaitForExit(); p.WaitForExit();
if (p.ExitCode != 0) if (p.ExitCode != 0)
{ {
throw new IOException($"Could not set executable bit for {path}"); throw new IOException($"Could not set executable bit for {path}");
} }
} }
} }
} }

View File

@@ -1,112 +1,112 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public static class FolderSearch public static class FolderSearch
{ {
private static readonly char[] _separators = { Path.DirectorySeparatorChar }; private static readonly char[] _separators = { Path.DirectorySeparatorChar };
public static string CurrentExecutingDirectory() public static string CurrentExecutingDirectory()
{ {
string filePath = new Uri(typeof(FolderSearch).GetTypeInfo().Assembly.CodeBase).LocalPath; string filePath = new Uri(typeof(FolderSearch).GetTypeInfo().Assembly.CodeBase).LocalPath;
return Path.GetDirectoryName(filePath); return Path.GetDirectoryName(filePath);
} }
public static string FindFolder(this string startPath, string searchPattern) public static string FindFolder(this string startPath, string searchPattern)
{ {
if (startPath == null || searchPattern == null) if (startPath == null || searchPattern == null)
{ {
return null; return null;
} }
string currentPath = startPath; string currentPath = startPath;
foreach (var part in searchPattern.Split(_separators, StringSplitOptions.None)) foreach (var part in searchPattern.Split(_separators, StringSplitOptions.None))
{ {
if (!Directory.Exists(currentPath)) if (!Directory.Exists(currentPath))
{ {
return null; return null;
} }
string[] matchesDirectory = Directory.GetDirectories(currentPath, part); string[] matchesDirectory = Directory.GetDirectories(currentPath, part);
if (!matchesDirectory.Any()) if (!matchesDirectory.Any())
{ {
return null; return null;
} }
if (matchesDirectory.Length > 1) if (matchesDirectory.Length > 1)
{ {
currentPath = MatchVersionToAssemblyVersion(matchesDirectory) currentPath = MatchVersionToAssemblyVersion(matchesDirectory)
?? matchesDirectory.OrderBy(x => x).Last(); ?? matchesDirectory.OrderBy(x => x).Last();
} }
else else
{ {
currentPath = matchesDirectory.First(); currentPath = matchesDirectory.First();
} }
} }
return currentPath; return currentPath;
} }
public static string FindFolderUpwards(this string startPath, string searchPattern) public static string FindFolderUpwards(this string startPath, string searchPattern)
{ {
if (string.IsNullOrEmpty(startPath)) if (string.IsNullOrEmpty(startPath))
{ {
return null; return null;
} }
string matchingFolder = startPath.FindFolder(searchPattern); string matchingFolder = startPath.FindFolder(searchPattern);
return matchingFolder ?? startPath.RemoveLastPart().FindFolderUpwards(searchPattern); return matchingFolder ?? startPath.RemoveLastPart().FindFolderUpwards(searchPattern);
} }
internal static string RemoveLastPart(this string path) internal static string RemoveLastPart(this string path)
{ {
if (!path.Contains(Path.DirectorySeparatorChar)) if (!path.Contains(Path.DirectorySeparatorChar))
{ {
return null; return null;
} }
List<string> parts = path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None).ToList(); List<string> parts = path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None).ToList();
parts.RemoveAt(parts.Count() - 1); parts.RemoveAt(parts.Count() - 1);
return string.Join(Path.DirectorySeparatorChar.ToString(), parts.ToArray()); return string.Join(Path.DirectorySeparatorChar.ToString(), parts.ToArray());
} }
/// <summary> /// <summary>
/// Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) /// Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
/// </summary> /// </summary>
public static string FinalizePath(string fileName) public static string FinalizePath(string fileName)
{ {
string finalPath; string finalPath;
if (Path.IsPathRooted(fileName)) if (Path.IsPathRooted(fileName))
{ {
finalPath = fileName; finalPath = fileName;
} }
else else
{ {
finalPath = Path.Combine(CurrentExecutingDirectory(), fileName); finalPath = Path.Combine(CurrentExecutingDirectory(), fileName);
finalPath = Path.GetFullPath(finalPath); finalPath = Path.GetFullPath(finalPath);
} }
return finalPath; return finalPath;
} }
private static string MatchVersionToAssemblyVersion(string[] folders) private static string MatchVersionToAssemblyVersion(string[] folders)
{ {
var version = typeof(FolderSearch).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; var version = typeof(FolderSearch).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
foreach (var folder in folders) foreach (var folder in folders)
{ {
var lastFolder = new DirectoryInfo(folder).Name; var lastFolder = new DirectoryInfo(folder).Name;
if (lastFolder == version) if (lastFolder == version)
return folder; return folder;
} }
return null; return null;
} }
} }
} }

View File

@@ -1,10 +1,10 @@
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IFileSystem public interface IFileSystem
{ {
void CreateFolder(string path); void CreateFolder(string path);
void DeleteFolder(string path); void DeleteFolder(string path);
void DeleteFile(string fullFileName); void DeleteFile(string fullFileName);
void MakeFileExecutable (string path ); void MakeFileExecutable (string path );
} }
} }

View File

@@ -1,7 +1,7 @@
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IMongoBinaryLocator public interface IMongoBinaryLocator
{ {
string Directory { get; } string Directory { get; }
} }
} }

View File

@@ -1,11 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IMongoDbProcess : IDisposable public interface IMongoDbProcess : IDisposable
{ {
IEnumerable<string> StandardOutput { get; } IEnumerable<string> StandardOutput { get; }
IEnumerable<string> ErrorOutput { get; } IEnumerable<string> ErrorOutput { get; }
} }
} }

View File

@@ -1,11 +1,11 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IMongoDbProcessStarter public interface IMongoDbProcessStarter
{ {
IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null); IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null);
IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool doNotKill, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null); IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool doNotKill, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null);
} }
} }

View File

@@ -1,10 +1,10 @@
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IPortPool public interface IPortPool
{ {
/// <summary> /// <summary>
/// Returns and reserves a new port /// Returns and reserves a new port
/// </summary> /// </summary>
int GetNextOpenPort(); int GetNextOpenPort();
} }
} }

View File

@@ -1,8 +1,8 @@
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IPortWatcher public interface IPortWatcher
{ {
int FindOpenPort(); int FindOpenPort();
bool IsPortAvailable(int portNumber); bool IsPortAvailable(int portNumber);
} }
} }

View File

@@ -1,7 +1,7 @@
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public interface IProcessWatcher public interface IProcessWatcher
{ {
bool IsProcessRunning(string processName); bool IsProcessRunning(string processName);
} }
} }

View File

@@ -1,101 +1,101 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class MongoBinaryLocator : IMongoBinaryLocator public class MongoBinaryLocator : IMongoBinaryLocator
{ {
private readonly string _nugetPrefix = Path.Combine("packages", "Mongo2Go*"); private readonly string _nugetPrefix = Path.Combine("packages", "Mongo2Go*");
private readonly string _nugetCachePrefix = Path.Combine("packages", "mongo2go", "*"); private readonly string _nugetCachePrefix = Path.Combine("packages", "mongo2go", "*");
private readonly string _nugetCacheBasePrefix = Path.Combine("mongo2go", "*"); private readonly string _nugetCacheBasePrefix = Path.Combine("mongo2go", "*");
public const string DefaultWindowsSearchPattern = @"tools\mongodb-windows*\bin"; public const string DefaultWindowsSearchPattern = @"tools\mongodb-windows*\bin";
public const string DefaultLinuxSearchPattern = "tools/mongodb-linux*/bin"; public const string DefaultLinuxSearchPattern = "tools/mongodb-linux*/bin";
public const string DefaultOsxSearchPattern = "tools/mongodb-macos*/bin"; public const string DefaultOsxSearchPattern = "tools/mongodb-macos*/bin";
public const string WindowsNugetCacheLocation = @"%USERPROFILE%\.nuget\packages"; public const string WindowsNugetCacheLocation = @"%USERPROFILE%\.nuget\packages";
public static readonly string OsxAndLinuxNugetCacheLocation = Environment.GetEnvironmentVariable("HOME") + "/.nuget/packages"; public static readonly string OsxAndLinuxNugetCacheLocation = Environment.GetEnvironmentVariable("HOME") + "/.nuget/packages";
private string _binFolder = string.Empty; private string _binFolder = string.Empty;
private readonly string _searchPattern; private readonly string _searchPattern;
private readonly string _nugetCacheDirectory; private readonly string _nugetCacheDirectory;
private readonly string _additionalSearchDirectory; private readonly string _additionalSearchDirectory;
public MongoBinaryLocator(string searchPatternOverride, string additionalSearchDirectory) public MongoBinaryLocator(string searchPatternOverride, string additionalSearchDirectory)
{ {
_additionalSearchDirectory = additionalSearchDirectory; _additionalSearchDirectory = additionalSearchDirectory;
_nugetCacheDirectory = Environment.GetEnvironmentVariable("NUGET_PACKAGES"); _nugetCacheDirectory = Environment.GetEnvironmentVariable("NUGET_PACKAGES");
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{ {
_searchPattern = DefaultOsxSearchPattern; _searchPattern = DefaultOsxSearchPattern;
_nugetCacheDirectory = _nugetCacheDirectory ?? OsxAndLinuxNugetCacheLocation; _nugetCacheDirectory = _nugetCacheDirectory ?? OsxAndLinuxNugetCacheLocation;
} }
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{ {
_searchPattern = DefaultLinuxSearchPattern; _searchPattern = DefaultLinuxSearchPattern;
_nugetCacheDirectory = _nugetCacheDirectory ?? OsxAndLinuxNugetCacheLocation; _nugetCacheDirectory = _nugetCacheDirectory ?? OsxAndLinuxNugetCacheLocation;
} }
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{ {
_searchPattern = DefaultWindowsSearchPattern; _searchPattern = DefaultWindowsSearchPattern;
_nugetCacheDirectory = _nugetCacheDirectory ?? Environment.ExpandEnvironmentVariables(WindowsNugetCacheLocation); _nugetCacheDirectory = _nugetCacheDirectory ?? Environment.ExpandEnvironmentVariables(WindowsNugetCacheLocation);
} }
else else
{ {
throw new MonogDbBinariesNotFoundException($"Unknown OS: {RuntimeInformation.OSDescription}"); throw new MonogDbBinariesNotFoundException($"Unknown OS: {RuntimeInformation.OSDescription}");
} }
if (!string.IsNullOrEmpty(searchPatternOverride)) if (!string.IsNullOrEmpty(searchPatternOverride))
{ {
_searchPattern = searchPatternOverride; _searchPattern = searchPatternOverride;
} }
} }
public string Directory { public string Directory {
get { get {
if (string.IsNullOrEmpty(_binFolder)){ if (string.IsNullOrEmpty(_binFolder)){
return _binFolder = ResolveBinariesDirectory (); return _binFolder = ResolveBinariesDirectory ();
} else { } else {
return _binFolder; return _binFolder;
} }
} }
} }
private string ResolveBinariesDirectory() private string ResolveBinariesDirectory()
{ {
var searchDirectories = new[] var searchDirectories = new[]
{ {
// First search from the additional search directory, if provided // First search from the additional search directory, if provided
_additionalSearchDirectory, _additionalSearchDirectory,
// Then search from the project directory // Then search from the project directory
FolderSearch.CurrentExecutingDirectory(), FolderSearch.CurrentExecutingDirectory(),
// Finally search from the nuget cache directory // Finally search from the nuget cache directory
_nugetCacheDirectory _nugetCacheDirectory
}; };
return FindBinariesDirectory(searchDirectories.Where(x => !string.IsNullOrWhiteSpace(x)).ToList()); return FindBinariesDirectory(searchDirectories.Where(x => !string.IsNullOrWhiteSpace(x)).ToList());
} }
private string FindBinariesDirectory(IList<string> searchDirectories) private string FindBinariesDirectory(IList<string> searchDirectories)
{ {
foreach (var directory in searchDirectories) foreach (var directory in searchDirectories)
{ {
var binaryFolder = var binaryFolder =
// First try just the search pattern // First try just the search pattern
directory.FindFolderUpwards(_searchPattern) ?? directory.FindFolderUpwards(_searchPattern) ??
// Next try the search pattern with nuget installation prefix // Next try the search pattern with nuget installation prefix
directory.FindFolderUpwards(Path.Combine(_nugetPrefix, _searchPattern)) ?? directory.FindFolderUpwards(Path.Combine(_nugetPrefix, _searchPattern)) ??
// Finally try the search pattern with the nuget cache prefix // Finally try the search pattern with the nuget cache prefix
directory.FindFolderUpwards(Path.Combine(_nugetCachePrefix, _searchPattern)) ?? directory.FindFolderUpwards(Path.Combine(_nugetCachePrefix, _searchPattern)) ??
// Finally try the search pattern with the basic nuget cache prefix // Finally try the search pattern with the basic nuget cache prefix
directory.FindFolderUpwards(Path.Combine(_nugetCacheBasePrefix, _searchPattern)); directory.FindFolderUpwards(Path.Combine(_nugetCacheBasePrefix, _searchPattern));
if (binaryFolder != null) return binaryFolder; if (binaryFolder != null) return binaryFolder;
} }
throw new MonogDbBinariesNotFoundException( throw new MonogDbBinariesNotFoundException(
$"Could not find Mongo binaries using the search patterns \"{_searchPattern}\", \"{Path.Combine(_nugetPrefix, _searchPattern)}\", \"{Path.Combine(_nugetCachePrefix, _searchPattern)}\", and \"{Path.Combine(_nugetCacheBasePrefix, _searchPattern)}\". " + $"Could not find Mongo binaries using the search patterns \"{_searchPattern}\", \"{Path.Combine(_nugetPrefix, _searchPattern)}\", \"{Path.Combine(_nugetCachePrefix, _searchPattern)}\", and \"{Path.Combine(_nugetCacheBasePrefix, _searchPattern)}\". " +
$"You can override the search pattern and directory when calling MongoDbRunner.Start. We have detected the OS as {RuntimeInformation.OSDescription}.\n" + $"You can override the search pattern and directory when calling MongoDbRunner.Start. We have detected the OS as {RuntimeInformation.OSDescription}.\n" +
$"We walked up to root directory from the following locations.\n {string.Join("\n", searchDirectories)}"); $"We walked up to root directory from the following locations.\n {string.Join("\n", searchDirectories)}");
} }
} }
} }

View File

@@ -1,55 +1,55 @@
using System; using System;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
// IDisposable and friends // IDisposable and friends
public partial class MongoDbProcess public partial class MongoDbProcess
{ {
~MongoDbProcess() ~MongoDbProcess()
{ {
Dispose(false); Dispose(false);
} }
public bool Disposed { get; private set; } public bool Disposed { get; private set; }
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
private void Dispose(bool disposing) private void Dispose(bool disposing)
{ {
if (Disposed) if (Disposed)
{ {
return; return;
} }
if (disposing) if (disposing)
{ {
// we have no "managed resources" - but we leave this switch to avoid an FxCop CA1801 warnig // we have no "managed resources" - but we leave this switch to avoid an FxCop CA1801 warnig
} }
if (_process == null) if (_process == null)
{ {
return; return;
} }
if (_process.DoNotKill) if (_process.DoNotKill)
{ {
return; return;
} }
if (!_process.HasExited) if (!_process.HasExited)
{ {
_process.Kill(); _process.Kill();
_process.WaitForExit(); _process.WaitForExit();
} }
_process.Dispose(); _process.Dispose();
_process = null; _process = null;
Disposed = true; Disposed = true;
} }
} }
} }

View File

@@ -1,19 +1,19 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public partial class MongoDbProcess : IMongoDbProcess public partial class MongoDbProcess : IMongoDbProcess
{ {
private WrappedProcess _process; private WrappedProcess _process;
public IEnumerable<string> ErrorOutput { get; set; } public IEnumerable<string> ErrorOutput { get; set; }
public IEnumerable<string> StandardOutput { get; set; } public IEnumerable<string> StandardOutput { get; set; }
internal MongoDbProcess(WrappedProcess process) internal MongoDbProcess(WrappedProcess process)
{ {
_process = process; _process = process;
} }
} }
} }

View File

@@ -1,92 +1,92 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using MongoDB.Driver.Core.Servers; using MongoDB.Driver.Core.Servers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class MongoDbProcessStarter : IMongoDbProcessStarter public class MongoDbProcessStarter : IMongoDbProcessStarter
{ {
private const string ProcessReadyIdentifier = "waiting for connections"; private const string ProcessReadyIdentifier = "waiting for connections";
private const string Space = " "; private const string Space = " ";
private const string ReplicaSetName = "singleNodeReplSet"; private const string ReplicaSetName = "singleNodeReplSet";
private const string ReplicaSetReadyIdentifier = "transition to primary complete; database writes are now permitted"; private const string ReplicaSetReadyIdentifier = "transition to primary complete; database writes are now permitted";
/// <summary> /// <summary>
/// Starts a new process. Process can be killed /// Starts a new process. Process can be killed
/// </summary> /// </summary>
public IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null) public IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null)
{ {
return Start(binariesDirectory, dataDirectory, port, false, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout, logger); return Start(binariesDirectory, dataDirectory, port, false, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout, logger);
} }
/// <summary> /// <summary>
/// Starts a new process. /// Starts a new process.
/// </summary> /// </summary>
public IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool doNotKill, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null) public IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool doNotKill, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null)
{ {
string fileName = @"{0}{1}{2}".Formatted(binariesDirectory, System.IO.Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.MongodExecutable); string fileName = @"{0}{1}{2}".Formatted(binariesDirectory, System.IO.Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.MongodExecutable);
string arguments = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) ? string arguments = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) ?
@"--dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port) : @"--dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port) :
@"--tlsMode disabled --dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port); @"--tlsMode disabled --dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port);
arguments = singleNodeReplSet ? arguments + Space + "--replSet" + Space + ReplicaSetName : arguments; arguments = singleNodeReplSet ? arguments + Space + "--replSet" + Space + ReplicaSetName : arguments;
arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments);
WrappedProcess wrappedProcess = ProcessControl.ProcessFactory(fileName, arguments); WrappedProcess wrappedProcess = ProcessControl.ProcessFactory(fileName, arguments);
wrappedProcess.DoNotKill = doNotKill; wrappedProcess.DoNotKill = doNotKill;
ProcessOutput output = ProcessControl.StartAndWaitForReady(wrappedProcess, 5, ProcessReadyIdentifier, logger); ProcessOutput output = ProcessControl.StartAndWaitForReady(wrappedProcess, 5, ProcessReadyIdentifier, logger);
if (singleNodeReplSet) if (singleNodeReplSet)
{ {
var replicaSetReady = false; var replicaSetReady = false;
// subscribe to output from mongod process and check for replica set ready message // subscribe to output from mongod process and check for replica set ready message
wrappedProcess.OutputDataReceived += (_, args) => replicaSetReady |= !string.IsNullOrWhiteSpace(args.Data) && args.Data.IndexOf(ReplicaSetReadyIdentifier, StringComparison.OrdinalIgnoreCase) >= 0; wrappedProcess.OutputDataReceived += (_, args) => replicaSetReady |= !string.IsNullOrWhiteSpace(args.Data) && args.Data.IndexOf(ReplicaSetReadyIdentifier, StringComparison.OrdinalIgnoreCase) >= 0;
MongoClient client = new MongoClient("mongodb://127.0.0.1:{0}/?directConnection=true&replicaSet={1}".Formatted(port, ReplicaSetName)); MongoClient client = new MongoClient("mongodb://127.0.0.1:{0}/?directConnection=true&replicaSet={1}".Formatted(port, ReplicaSetName));
var admin = client.GetDatabase("admin"); var admin = client.GetDatabase("admin");
var replConfig = new BsonDocument(new List<BsonElement>() var replConfig = new BsonDocument(new List<BsonElement>()
{ {
new BsonElement("_id", ReplicaSetName), new BsonElement("_id", ReplicaSetName),
new BsonElement("members", new BsonElement("members",
new BsonArray {new BsonDocument {{"_id", 0}, {"host", "127.0.0.1:{0}".Formatted(port)}}}) new BsonArray {new BsonDocument {{"_id", 0}, {"host", "127.0.0.1:{0}".Formatted(port)}}})
}); });
var command = new BsonDocument("replSetInitiate", replConfig); var command = new BsonDocument("replSetInitiate", replConfig);
admin.RunCommand<BsonDocument>(command); admin.RunCommand<BsonDocument>(command);
// wait until replica set is ready or until the timeout is reached // wait until replica set is ready or until the timeout is reached
SpinWait.SpinUntil(() => replicaSetReady, TimeSpan.FromSeconds(singleNodeReplSetWaitTimeout)); SpinWait.SpinUntil(() => replicaSetReady, TimeSpan.FromSeconds(singleNodeReplSetWaitTimeout));
if (!replicaSetReady) if (!replicaSetReady)
{ {
throw new TimeoutException($"Replica set initialization took longer than the specified timeout of {singleNodeReplSetWaitTimeout} seconds. Please consider increasing the value of {nameof(singleNodeReplSetWaitTimeout)}."); throw new TimeoutException($"Replica set initialization took longer than the specified timeout of {singleNodeReplSetWaitTimeout} seconds. Please consider increasing the value of {nameof(singleNodeReplSetWaitTimeout)}.");
} }
// wait until transaction is ready or until the timeout is reached // wait until transaction is ready or until the timeout is reached
SpinWait.SpinUntil(() => SpinWait.SpinUntil(() =>
client.Cluster.Description.Servers.Any(s => s.State == ServerState.Connected && s.IsDataBearing), client.Cluster.Description.Servers.Any(s => s.State == ServerState.Connected && s.IsDataBearing),
TimeSpan.FromSeconds(singleNodeReplSetWaitTimeout)); TimeSpan.FromSeconds(singleNodeReplSetWaitTimeout));
if (!client.Cluster.Description.Servers.Any(s => s.State == ServerState.Connected && s.IsDataBearing)) if (!client.Cluster.Description.Servers.Any(s => s.State == ServerState.Connected && s.IsDataBearing))
{ {
throw new TimeoutException($"Cluster readiness for transactions took longer than the specified timeout of {singleNodeReplSetWaitTimeout} seconds. Please consider increasing the value of {nameof(singleNodeReplSetWaitTimeout)}."); throw new TimeoutException($"Cluster readiness for transactions took longer than the specified timeout of {singleNodeReplSetWaitTimeout} seconds. Please consider increasing the value of {nameof(singleNodeReplSetWaitTimeout)}.");
} }
} }
MongoDbProcess mongoDbProcess = new MongoDbProcess(wrappedProcess) MongoDbProcess mongoDbProcess = new MongoDbProcess(wrappedProcess)
{ {
ErrorOutput = output.ErrorOutput, ErrorOutput = output.ErrorOutput,
StandardOutput = output.StandardOutput StandardOutput = output.StandardOutput
}; };
return mongoDbProcess; return mongoDbProcess;
} }
} }
} }

View File

@@ -1,46 +1,46 @@
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public static class MongoImportExport public static class MongoImportExport
{ {
/// <summary> /// <summary>
/// Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) /// Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
/// </summary> /// </summary>
public static ProcessOutput Import(string binariesDirectory, int port, string database, string collection, string inputFile, bool drop, string additionalMongodArguments = null) public static ProcessOutput Import(string binariesDirectory, int port, string database, string collection, string inputFile, bool drop, string additionalMongodArguments = null)
{ {
string finalPath = FolderSearch.FinalizePath(inputFile); string finalPath = FolderSearch.FinalizePath(inputFile);
if (!File.Exists(finalPath)) if (!File.Exists(finalPath))
{ {
throw new FileNotFoundException("File not found", finalPath); throw new FileNotFoundException("File not found", finalPath);
} }
string fileName = Path.Combine("{0}", "{1}").Formatted(binariesDirectory, MongoDbDefaults.MongoImportExecutable); string fileName = Path.Combine("{0}", "{1}").Formatted(binariesDirectory, MongoDbDefaults.MongoImportExecutable);
string arguments = @"--host localhost --port {0} --db {1} --collection {2} --file ""{3}""".Formatted(port, database, collection, finalPath); string arguments = @"--host localhost --port {0} --db {1} --collection {2} --file ""{3}""".Formatted(port, database, collection, finalPath);
if (drop) { arguments += " --drop"; } if (drop) { arguments += " --drop"; }
arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments);
Process process = ProcessControl.ProcessFactory(fileName, arguments); Process process = ProcessControl.ProcessFactory(fileName, arguments);
return ProcessControl.StartAndWaitForExit(process); return ProcessControl.StartAndWaitForExit(process);
} }
/// <summary> /// <summary>
/// Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) /// Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
/// </summary> /// </summary>
public static ProcessOutput Export(string binariesDirectory, int port, string database, string collection, string outputFile, string additionalMongodArguments = null) public static ProcessOutput Export(string binariesDirectory, int port, string database, string collection, string outputFile, string additionalMongodArguments = null)
{ {
string finalPath = FolderSearch.FinalizePath(outputFile); string finalPath = FolderSearch.FinalizePath(outputFile);
string fileName = Path.Combine("{0}", "{1}").Formatted(binariesDirectory, MongoDbDefaults.MongoExportExecutable); string fileName = Path.Combine("{0}", "{1}").Formatted(binariesDirectory, MongoDbDefaults.MongoExportExecutable);
string arguments = @"--host localhost --port {0} --db {1} --collection {2} --out ""{3}""".Formatted(port, database, collection, finalPath); string arguments = @"--host localhost --port {0} --db {1} --collection {2} --out ""{3}""".Formatted(port, database, collection, finalPath);
arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments);
Process process = ProcessControl.ProcessFactory(fileName, arguments); Process process = ProcessControl.ProcessFactory(fileName, arguments);
return ProcessControl.StartAndWaitForExit(process); return ProcessControl.StartAndWaitForExit(process);
} }
} }
} }

View File

@@ -1,77 +1,77 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
/// <summary> /// <summary>
/// Structure of a log generated by mongod. Used to deserialize the logs /// Structure of a log generated by mongod. Used to deserialize the logs
/// and pass them to an ILogger. /// and pass them to an ILogger.
/// See: https://docs.mongodb.com/manual/reference/log-messages/#json-log-output-format /// See: https://docs.mongodb.com/manual/reference/log-messages/#json-log-output-format
/// Note: "truncated" and "size" are not parsed as we're unsure how to /// Note: "truncated" and "size" are not parsed as we're unsure how to
/// properly parse and use them. /// properly parse and use them.
/// </summary> /// </summary>
class MongoLogStatement class MongoLogStatement
{ {
[JsonPropertyName("t")] [JsonPropertyName("t")]
public MongoDate MongoDate { get; set; } public MongoDate MongoDate { get; set; }
/// <summary> /// <summary>
/// Severity of the logs as defined by MongoDB. Mapped to LogLevel /// Severity of the logs as defined by MongoDB. Mapped to LogLevel
/// as defined by Microsoft. /// as defined by Microsoft.
/// D1-D2 mapped to Debug level. D3-D5 mapped Trace level. /// D1-D2 mapped to Debug level. D3-D5 mapped Trace level.
/// </summary> /// </summary>
[JsonPropertyName("s")] [JsonPropertyName("s")]
public string Severity { get; set; } public string Severity { get; set; }
public LogLevel Level public LogLevel Level
{ {
get get
{ {
if (string.IsNullOrEmpty(Severity)) if (string.IsNullOrEmpty(Severity))
return LogLevel.None; return LogLevel.None;
switch (Severity) switch (Severity)
{ {
case "F": return LogLevel.Critical; case "F": return LogLevel.Critical;
case "E": return LogLevel.Error; case "E": return LogLevel.Error;
case "W": return LogLevel.Warning; case "W": return LogLevel.Warning;
case "I": return LogLevel.Information; case "I": return LogLevel.Information;
case "D": case "D":
case "D1": case "D1":
case "D2": case "D2":
return LogLevel.Debug; return LogLevel.Debug;
case "D3": case "D3":
case "D4": case "D4":
case "D5": case "D5":
default: default:
return LogLevel.Trace; return LogLevel.Trace;
} }
} }
} }
[JsonPropertyName("c")] [JsonPropertyName("c")]
public string Component { get; set; } public string Component { get; set; }
[JsonPropertyName("ctx")] [JsonPropertyName("ctx")]
public string Context { get; set; } public string Context { get; set; }
[JsonPropertyName("id")] [JsonPropertyName("id")]
public int? Id { get; set; } public int? Id { get; set; }
[JsonPropertyName("msg")] [JsonPropertyName("msg")]
public string Message { get; set; } public string Message { get; set; }
[JsonPropertyName("tags")] [JsonPropertyName("tags")]
public IEnumerable<string> Tags { get; set; } public IEnumerable<string> Tags { get; set; }
[JsonPropertyName("attr")] [JsonPropertyName("attr")]
public IDictionary<string, JsonElement> Attributes { get; set; } public IDictionary<string, JsonElement> Attributes { get; set; }
} }
class MongoDate class MongoDate
{ {
[JsonPropertyName("$date")] [JsonPropertyName("$date")]
public DateTime DateTime { get; set; } public DateTime DateTime { get; set; }
} }
} }

View File

@@ -1,74 +1,74 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public static class MongodArguments public static class MongodArguments
{ {
private const string ArgumentSeparator = "--"; private const string ArgumentSeparator = "--";
private const string Space = " "; private const string Space = " ";
/// <summary> /// <summary>
/// Returns the <paramref name="additionalMongodArguments" /> if it is verified that it does not contain any mongod argument already defined by Mongo2Go. /// Returns the <paramref name="additionalMongodArguments" /> if it is verified that it does not contain any mongod argument already defined by Mongo2Go.
/// </summary> /// </summary>
/// <param name="existingMongodArguments">mongod arguments defined by Mongo2Go</param> /// <param name="existingMongodArguments">mongod arguments defined by Mongo2Go</param>
/// <param name="additionalMongodArguments">Additional mongod arguments</param> /// <param name="additionalMongodArguments">Additional mongod arguments</param>
/// <exception cref="T:System.ArgumentException"><paramref name="additionalMongodArguments" /> contains at least one mongod argument already defined by Mongo2Go</exception> /// <exception cref="T:System.ArgumentException"><paramref name="additionalMongodArguments" /> contains at least one mongod argument already defined by Mongo2Go</exception>
/// <returns>A string with the additional mongod arguments</returns> /// <returns>A string with the additional mongod arguments</returns>
public static string GetValidAdditionalArguments(string existingMongodArguments, string additionalMongodArguments) public static string GetValidAdditionalArguments(string existingMongodArguments, string additionalMongodArguments)
{ {
if (string.IsNullOrWhiteSpace(additionalMongodArguments)) if (string.IsNullOrWhiteSpace(additionalMongodArguments))
{ {
return string.Empty; return string.Empty;
} }
var existingMongodArgumentArray = existingMongodArguments.Trim().Split(new[] { ArgumentSeparator }, StringSplitOptions.RemoveEmptyEntries); var existingMongodArgumentArray = existingMongodArguments.Trim().Split(new[] { ArgumentSeparator }, StringSplitOptions.RemoveEmptyEntries);
var existingMongodArgumentOptions = new List<string>(); var existingMongodArgumentOptions = new List<string>();
for (var i = 0; i < existingMongodArgumentArray.Length; i++) for (var i = 0; i < existingMongodArgumentArray.Length; i++)
{ {
var argumentOptionSplit = existingMongodArgumentArray[i].Split(' '); var argumentOptionSplit = existingMongodArgumentArray[i].Split(' ');
if (argumentOptionSplit.Length == 0 if (argumentOptionSplit.Length == 0
|| string.IsNullOrWhiteSpace(argumentOptionSplit[0].Trim())) || string.IsNullOrWhiteSpace(argumentOptionSplit[0].Trim()))
{ {
continue; continue;
} }
existingMongodArgumentOptions.Add(argumentOptionSplit[0].Trim()); existingMongodArgumentOptions.Add(argumentOptionSplit[0].Trim());
} }
var additionalMongodArgumentArray = additionalMongodArguments.Trim().Split(new[] { ArgumentSeparator }, StringSplitOptions.RemoveEmptyEntries); var additionalMongodArgumentArray = additionalMongodArguments.Trim().Split(new[] { ArgumentSeparator }, StringSplitOptions.RemoveEmptyEntries);
var validAdditionalMongodArguments = new List<string>(); var validAdditionalMongodArguments = new List<string>();
var duplicateMongodArguments = new List<string>(); var duplicateMongodArguments = new List<string>();
for (var i = 0; i < additionalMongodArgumentArray.Length; i++) for (var i = 0; i < additionalMongodArgumentArray.Length; i++)
{ {
var additionalArgument = additionalMongodArgumentArray[i].Trim(); var additionalArgument = additionalMongodArgumentArray[i].Trim();
var argumentOptionSplit = additionalArgument.Split(' '); var argumentOptionSplit = additionalArgument.Split(' ');
if (argumentOptionSplit.Length == 0 if (argumentOptionSplit.Length == 0
|| string.IsNullOrWhiteSpace(argumentOptionSplit[0].Trim())) || string.IsNullOrWhiteSpace(argumentOptionSplit[0].Trim()))
{ {
continue; continue;
} }
if (existingMongodArgumentOptions.Contains(argumentOptionSplit[0].Trim())) if (existingMongodArgumentOptions.Contains(argumentOptionSplit[0].Trim()))
{ {
duplicateMongodArguments.Add(argumentOptionSplit[0].Trim()); duplicateMongodArguments.Add(argumentOptionSplit[0].Trim());
} }
validAdditionalMongodArguments.Add(ArgumentSeparator + additionalArgument); validAdditionalMongodArguments.Add(ArgumentSeparator + additionalArgument);
} }
if (duplicateMongodArguments.Count != 0) if (duplicateMongodArguments.Count != 0)
{ {
throw new ArgumentException($"mongod arguments defined by Mongo2Go ({string.Join(", ", existingMongodArgumentOptions)}) cannot be overriden. Please remove the following additional argument(s): {string.Join(", ", duplicateMongodArguments)}."); throw new ArgumentException($"mongod arguments defined by Mongo2Go ({string.Join(", ", existingMongodArgumentOptions)}) cannot be overriden. Please remove the following additional argument(s): {string.Join(", ", duplicateMongodArguments)}.");
} }
return validAdditionalMongodArguments.Count == 0 return validAdditionalMongodArguments.Count == 0
? string.Empty ? string.Empty
: Space + string.Join(" ", validAdditionalMongodArguments); : Space + string.Join(" ", validAdditionalMongodArguments);
} }
} }
} }

View File

@@ -1,24 +1,24 @@
#if NETSTANDARD2_0 #if NETSTANDARD2_0
using System; using System;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public static class NetStandard21Compatibility public static class NetStandard21Compatibility
{ {
/// <summary> /// <summary>
/// Returns a value indicating whether a specified string occurs within this <paramref name="string"/>, using the specified comparison rules. /// Returns a value indicating whether a specified string occurs within this <paramref name="string"/>, using the specified comparison rules.
/// </summary> /// </summary>
/// <param name="string">The string to operate on.</param> /// <param name="string">The string to operate on.</param>
/// <param name="value">The string to seek.</param> /// <param name="value">The string to seek.</param>
/// <param name="comparisonType">One of the enumeration values that specifies the rules to use in the comparison.</param> /// <param name="comparisonType">One of the enumeration values that specifies the rules to use in the comparison.</param>
/// <returns><see langword="true"/> if the <paramref name="value"/> parameter occurs within this string, or if <paramref name="value"/> is the empty string (""); otherwise, <see langword="false"/>.</returns> /// <returns><see langword="true"/> if the <paramref name="value"/> parameter occurs within this string, or if <paramref name="value"/> is the empty string (""); otherwise, <see langword="false"/>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="value"/> is <see langword="null"/></exception> /// <exception cref="ArgumentNullException"><paramref name="value"/> is <see langword="null"/></exception>
public static bool Contains(this string @string, string value, StringComparison comparisonType) public static bool Contains(this string @string, string value, StringComparison comparisonType)
{ {
if (@string == null) throw new ArgumentNullException(nameof(@string)); if (@string == null) throw new ArgumentNullException(nameof(@string));
return @string.IndexOf(value, comparisonType) >= 0; return @string.IndexOf(value, comparisonType) >= 0;
} }
} }
} }
#endif #endif

View File

@@ -1,11 +1,11 @@
using System; using System;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class NoFreePortFoundException : Exception public class NoFreePortFoundException : Exception
{ {
public NoFreePortFoundException() { } public NoFreePortFoundException() { }
public NoFreePortFoundException(string message) : base(message) { } public NoFreePortFoundException(string message) : base(message) { }
public NoFreePortFoundException(string message, Exception inner) : base(message, inner) { } public NoFreePortFoundException(string message, Exception inner) : base(message, inner) { }
} }
} }

View File

@@ -1,37 +1,37 @@
using System; using System;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
/// <summary> /// <summary>
/// Intention: port numbers won't be assigned twice to avoid connection problems with integration tests /// Intention: port numbers won't be assigned twice to avoid connection problems with integration tests
/// </summary> /// </summary>
public sealed class PortPool : IPortPool public sealed class PortPool : IPortPool
{ {
private static readonly PortPool Instance = new PortPool(); private static readonly PortPool Instance = new PortPool();
// Explicit static constructor to tell C# compiler // Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit // not to mark type as beforefieldinit
static PortPool() static PortPool()
{ {
} }
// Singleton // Singleton
private PortPool() private PortPool()
{ {
} }
public static PortPool GetInstance public static PortPool GetInstance
{ {
get { return Instance; } get { return Instance; }
} }
/// <summary> /// <summary>
/// Returns and reserves a new port /// Returns and reserves a new port
/// </summary> /// </summary>
public int GetNextOpenPort() public int GetNextOpenPort()
{ {
IPortWatcher portWatcher = PortWatcherFactory.CreatePortWatcher(); IPortWatcher portWatcher = PortWatcherFactory.CreatePortWatcher();
return portWatcher.FindOpenPort(); return portWatcher.FindOpenPort();
} }
} }
} }

View File

@@ -1,38 +1,38 @@
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Net.Sockets; using System.Net.Sockets;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class PortWatcher : IPortWatcher public class PortWatcher : IPortWatcher
{ {
public int FindOpenPort() public int FindOpenPort()
{ {
// Locate a free port on the local machine by binding a socket to // Locate a free port on the local machine by binding a socket to
// an IPEndPoint using IPAddress.Any and port 0. The socket will // an IPEndPoint using IPAddress.Any and port 0. The socket will
// select a free port. // select a free port.
int listeningPort = 0; int listeningPort = 0;
Socket portSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket portSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try try
{ {
IPEndPoint socketEndPoint = new IPEndPoint(IPAddress.Any, 0); IPEndPoint socketEndPoint = new IPEndPoint(IPAddress.Any, 0);
portSocket.Bind(socketEndPoint); portSocket.Bind(socketEndPoint);
socketEndPoint = (IPEndPoint)portSocket.LocalEndPoint; socketEndPoint = (IPEndPoint)portSocket.LocalEndPoint;
listeningPort = socketEndPoint.Port; listeningPort = socketEndPoint.Port;
} }
finally finally
{ {
portSocket.Close(); portSocket.Close();
} }
return listeningPort; return listeningPort;
} }
public bool IsPortAvailable(int portNumber) public bool IsPortAvailable(int portNumber)
{ {
IPEndPoint[] tcpConnInfoArray = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners(); IPEndPoint[] tcpConnInfoArray = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners();
return tcpConnInfoArray.All(endpoint => endpoint.Port != portNumber); return tcpConnInfoArray.All(endpoint => endpoint.Port != portNumber);
} }
} }
} }

View File

@@ -1,14 +1,14 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class PortWatcherFactory public class PortWatcherFactory
{ {
public static IPortWatcher CreatePortWatcher() public static IPortWatcher CreatePortWatcher()
{ {
return RuntimeInformation.IsOSPlatform(OSPlatform.Linux) return RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
? (IPortWatcher) new UnixPortWatcher() ? (IPortWatcher) new UnixPortWatcher()
: new PortWatcher(); : new PortWatcher();
} }
} }
} }

View File

@@ -1,163 +1,163 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public static class ProcessControl public static class ProcessControl
{ {
public static WrappedProcess ProcessFactory(string fileName, string arguments) public static WrappedProcess ProcessFactory(string fileName, string arguments)
{ {
ProcessStartInfo startInfo = new ProcessStartInfo ProcessStartInfo startInfo = new ProcessStartInfo
{ {
FileName = fileName, FileName = fileName,
Arguments = arguments, Arguments = arguments,
CreateNoWindow = true, CreateNoWindow = true,
UseShellExecute = false, UseShellExecute = false,
RedirectStandardOutput = true, RedirectStandardOutput = true,
RedirectStandardError = true RedirectStandardError = true
}; };
WrappedProcess process = new WrappedProcess { StartInfo = startInfo }; WrappedProcess process = new WrappedProcess { StartInfo = startInfo };
return process; return process;
} }
public static ProcessOutput StartAndWaitForExit(Process process) public static ProcessOutput StartAndWaitForExit(Process process)
{ {
List<string> errorOutput = new List<string>(); List<string> errorOutput = new List<string>();
List<string> standardOutput = new List<string>(); List<string> standardOutput = new List<string>();
process.ErrorDataReceived += (sender, args) => errorOutput.Add(args.Data); process.ErrorDataReceived += (sender, args) => errorOutput.Add(args.Data);
process.OutputDataReceived += (sender, args) => standardOutput.Add(args.Data); process.OutputDataReceived += (sender, args) => standardOutput.Add(args.Data);
process.Start(); process.Start();
process.BeginErrorReadLine(); process.BeginErrorReadLine();
process.BeginOutputReadLine(); process.BeginOutputReadLine();
process.WaitForExit(); process.WaitForExit();
process.CancelErrorRead(); process.CancelErrorRead();
process.CancelOutputRead(); process.CancelOutputRead();
return new ProcessOutput(errorOutput, standardOutput); return new ProcessOutput(errorOutput, standardOutput);
} }
/// <summary> /// <summary>
/// Reads from Output stream to determine if process is ready /// Reads from Output stream to determine if process is ready
/// </summary> /// </summary>
public static ProcessOutput StartAndWaitForReady(Process process, int timeoutInSeconds, string processReadyIdentifier, ILogger logger = null) public static ProcessOutput StartAndWaitForReady(Process process, int timeoutInSeconds, string processReadyIdentifier, ILogger logger = null)
{ {
if (timeoutInSeconds < 1 || if (timeoutInSeconds < 1 ||
timeoutInSeconds > 10) timeoutInSeconds > 10)
{ {
throw new ArgumentOutOfRangeException("timeoutInSeconds", "The amount in seconds should have a value between 1 and 10."); throw new ArgumentOutOfRangeException("timeoutInSeconds", "The amount in seconds should have a value between 1 and 10.");
} }
// Determine when the process is ready, and store the error and standard outputs // Determine when the process is ready, and store the error and standard outputs
// to eventually return them. // to eventually return them.
List<string> errorOutput = new List<string>(); List<string> errorOutput = new List<string>();
List<string> standardOutput = new List<string>(); List<string> standardOutput = new List<string>();
bool processReady = false; bool processReady = false;
void OnProcessOnErrorDataReceived(object sender, DataReceivedEventArgs args) => errorOutput.Add(args.Data); void OnProcessOnErrorDataReceived(object sender, DataReceivedEventArgs args) => errorOutput.Add(args.Data);
void OnProcessOnOutputDataReceived(object sender, DataReceivedEventArgs args) void OnProcessOnOutputDataReceived(object sender, DataReceivedEventArgs args)
{ {
standardOutput.Add(args.Data); standardOutput.Add(args.Data);
if (!string.IsNullOrEmpty(args.Data) && args.Data.IndexOf(processReadyIdentifier, StringComparison.OrdinalIgnoreCase) >= 0) if (!string.IsNullOrEmpty(args.Data) && args.Data.IndexOf(processReadyIdentifier, StringComparison.OrdinalIgnoreCase) >= 0)
{ {
processReady = true; processReady = true;
} }
} }
process.ErrorDataReceived += OnProcessOnErrorDataReceived; process.ErrorDataReceived += OnProcessOnErrorDataReceived;
process.OutputDataReceived += OnProcessOnOutputDataReceived; process.OutputDataReceived += OnProcessOnOutputDataReceived;
if (logger == null) if (logger == null)
WireLogsToConsoleAndDebugOutput(process); WireLogsToConsoleAndDebugOutput(process);
else else
WireLogsToLogger(process, logger); WireLogsToLogger(process, logger);
process.Start(); process.Start();
process.BeginErrorReadLine(); process.BeginErrorReadLine();
process.BeginOutputReadLine(); process.BeginOutputReadLine();
int lastResortCounter = 0; int lastResortCounter = 0;
int timeOut = timeoutInSeconds * 10; int timeOut = timeoutInSeconds * 10;
while (!processReady) while (!processReady)
{ {
Thread.Sleep(100); Thread.Sleep(100);
if (++lastResortCounter > timeOut) if (++lastResortCounter > timeOut)
{ {
// we waited X seconds. // we waited X seconds.
// for any reason the detection did not worked, eg. the identifier changed // for any reason the detection did not worked, eg. the identifier changed
// lets assume everything is still ok // lets assume everything is still ok
break; break;
} }
} }
//unsubscribing writing to list - to prevent memory overflow. //unsubscribing writing to list - to prevent memory overflow.
process.ErrorDataReceived -= OnProcessOnErrorDataReceived; process.ErrorDataReceived -= OnProcessOnErrorDataReceived;
process.OutputDataReceived -= OnProcessOnOutputDataReceived; process.OutputDataReceived -= OnProcessOnOutputDataReceived;
return new ProcessOutput(errorOutput, standardOutput); return new ProcessOutput(errorOutput, standardOutput);
} }
/// <summary> /// <summary>
/// Send the mongod process logs to .NET's console and debug outputs. /// Send the mongod process logs to .NET's console and debug outputs.
/// </summary> /// </summary>
/// <param name="process"></param> /// <param name="process"></param>
private static void WireLogsToConsoleAndDebugOutput(Process process) private static void WireLogsToConsoleAndDebugOutput(Process process)
{ {
void DebugOutputHandler(object sender, DataReceivedEventArgs args) => Debug.WriteLine(args.Data); void DebugOutputHandler(object sender, DataReceivedEventArgs args) => Debug.WriteLine(args.Data);
void ConsoleOutputHandler(object sender, DataReceivedEventArgs args) => Console.WriteLine(args.Data); void ConsoleOutputHandler(object sender, DataReceivedEventArgs args) => Console.WriteLine(args.Data);
//Writing to debug trace & console to enable test runners to capture the output //Writing to debug trace & console to enable test runners to capture the output
process.ErrorDataReceived += DebugOutputHandler; process.ErrorDataReceived += DebugOutputHandler;
process.ErrorDataReceived += ConsoleOutputHandler; process.ErrorDataReceived += ConsoleOutputHandler;
process.OutputDataReceived += DebugOutputHandler; process.OutputDataReceived += DebugOutputHandler;
process.OutputDataReceived += ConsoleOutputHandler; process.OutputDataReceived += ConsoleOutputHandler;
} }
/// <summary> /// <summary>
/// Parses and redirects mongod logs to ILogger. /// Parses and redirects mongod logs to ILogger.
/// </summary> /// </summary>
/// <param name="process"></param> /// <param name="process"></param>
/// <param name="logger"></param> /// <param name="logger"></param>
private static void WireLogsToLogger(Process process, ILogger logger) private static void WireLogsToLogger(Process process, ILogger logger)
{ {
// Parse the structured log and wire it to logger // Parse the structured log and wire it to logger
void OnReceivingLogFromMongod(object sender, DataReceivedEventArgs args) void OnReceivingLogFromMongod(object sender, DataReceivedEventArgs args)
{ {
if (string.IsNullOrWhiteSpace(args.Data)) if (string.IsNullOrWhiteSpace(args.Data))
return; return;
try try
{ {
var log = JsonSerializer.Deserialize<MongoLogStatement>(args.Data); var log = JsonSerializer.Deserialize<MongoLogStatement>(args.Data);
logger.Log(log.Level, logger.Log(log.Level,
"{message} - {attributes} - {date} - {component} - {context} - {id} - {tags}", "{message} - {attributes} - {date} - {component} - {context} - {id} - {tags}",
log.Message, log.Attributes, log.MongoDate.DateTime, log.Component, log.Context, log.Id, log.Tags); log.Message, log.Attributes, log.MongoDate.DateTime, log.Component, log.Context, log.Id, log.Tags);
} }
catch (Exception ex) when (ex is JsonException || ex is NotSupportedException) catch (Exception ex) when (ex is JsonException || ex is NotSupportedException)
{ {
logger.LogWarning(ex, logger.LogWarning(ex,
"Failed parsing the mongod logs {log}. It could be that the format has changed. " + "Failed parsing the mongod logs {log}. It could be that the format has changed. " +
"See: https://docs.mongodb.com/manual/reference/log-messages/#std-label-log-message-json-output-format", "See: https://docs.mongodb.com/manual/reference/log-messages/#std-label-log-message-json-output-format",
args.Data); args.Data);
} }
catch (Exception) catch (Exception)
{ {
// Nothing else to do. Swallow the exception and do not wire the logs. // Nothing else to do. Swallow the exception and do not wire the logs.
} }
}; };
process.ErrorDataReceived += OnReceivingLogFromMongod; process.ErrorDataReceived += OnReceivingLogFromMongod;
process.OutputDataReceived += OnReceivingLogFromMongod; process.OutputDataReceived += OnReceivingLogFromMongod;
} }
} }
} }

View File

@@ -1,16 +1,16 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class ProcessOutput public class ProcessOutput
{ {
public ProcessOutput(IEnumerable<string> errorOutput, IEnumerable<string> standardOutput) public ProcessOutput(IEnumerable<string> errorOutput, IEnumerable<string> standardOutput)
{ {
StandardOutput = standardOutput; StandardOutput = standardOutput;
ErrorOutput = errorOutput; ErrorOutput = errorOutput;
} }
public IEnumerable<string> StandardOutput { get; private set; } public IEnumerable<string> StandardOutput { get; private set; }
public IEnumerable<string> ErrorOutput { get; private set; } public IEnumerable<string> ErrorOutput { get; private set; }
} }
} }

View File

@@ -1,13 +1,13 @@
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class ProcessWatcher : IProcessWatcher public class ProcessWatcher : IProcessWatcher
{ {
public bool IsProcessRunning(string processName) public bool IsProcessRunning(string processName)
{ {
return Process.GetProcessesByName(processName).Any(); return Process.GetProcessesByName(processName).Any();
} }
} }
} }

View File

@@ -1,27 +1,27 @@
using System; using System;
using System.Globalization; using System.Globalization;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
/// <summary> /// <summary>
/// saves about 40 keystrokes /// saves about 40 keystrokes
/// </summary> /// </summary>
public static class StringFormatExtension public static class StringFormatExtension
{ {
/// <summary> /// <summary>
/// Populates the template using the provided arguments and the invariant culture /// Populates the template using the provided arguments and the invariant culture
/// </summary> /// </summary>
public static string Formatted(this string template, params object[] args) public static string Formatted(this string template, params object[] args)
{ {
return template.Formatted(CultureInfo.InvariantCulture, args); return template.Formatted(CultureInfo.InvariantCulture, args);
} }
/// <summary> /// <summary>
/// Populates the template using the provided arguments using the provided formatter /// Populates the template using the provided arguments using the provided formatter
/// </summary> /// </summary>
public static string Formatted(this string template, IFormatProvider formatter, params object[] args) public static string Formatted(this string template, IFormatProvider formatter, params object[] args)
{ {
return string.IsNullOrEmpty(template) ? string.Empty : string.Format(formatter, template, args); return string.IsNullOrEmpty(template) ? string.Empty : string.Format(formatter, template, args);
} }
} }
} }

View File

@@ -1,46 +1,46 @@
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class UnixPortWatcher : IPortWatcher public class UnixPortWatcher : IPortWatcher
{ {
public int FindOpenPort () public int FindOpenPort ()
{ {
// Locate a free port on the local machine by binding a socket to // Locate a free port on the local machine by binding a socket to
// an IPEndPoint using IPAddress.Any and port 0. The socket will // an IPEndPoint using IPAddress.Any and port 0. The socket will
// select a free port. // select a free port.
int listeningPort = 0; int listeningPort = 0;
Socket portSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket portSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try try
{ {
IPEndPoint socketEndPoint = new IPEndPoint(IPAddress.Any, 0); IPEndPoint socketEndPoint = new IPEndPoint(IPAddress.Any, 0);
portSocket.Bind(socketEndPoint); portSocket.Bind(socketEndPoint);
socketEndPoint = (IPEndPoint)portSocket.LocalEndPoint; socketEndPoint = (IPEndPoint)portSocket.LocalEndPoint;
listeningPort = socketEndPoint.Port; listeningPort = socketEndPoint.Port;
} }
finally finally
{ {
portSocket.Close(); portSocket.Close();
} }
return listeningPort; return listeningPort;
} }
public bool IsPortAvailable (int portNumber) public bool IsPortAvailable (int portNumber)
{ {
TcpListener tcpListener = new TcpListener (IPAddress.Loopback, portNumber); TcpListener tcpListener = new TcpListener (IPAddress.Loopback, portNumber);
try { try {
tcpListener.Start (); tcpListener.Start ();
return true; return true;
} }
catch (SocketException) { catch (SocketException) {
return false; return false;
} finally } finally
{ {
tcpListener.Stop (); tcpListener.Stop ();
} }
} }
} }
} }

View File

@@ -1,9 +1,9 @@
using System.Diagnostics; using System.Diagnostics;
namespace Mongo2Go.Helper namespace Mongo2Go.Helper
{ {
public class WrappedProcess : Process public class WrappedProcess : Process
{ {
public bool DoNotKill { get; set; } public bool DoNotKill { get; set; }
} }
} }

View File

@@ -1,93 +1,93 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net472;netstandard2.1</TargetFrameworks> <TargetFrameworks>net472;netstandard2.1</TargetFrameworks>
<Authors>Johannes Hoppe and many contributors</Authors> <Authors>Johannes Hoppe and many contributors</Authors>
<Description>Mongo2Go is a managed wrapper around MongoDB binaries. It targets .NET Framework 4.7.2 and .NET Standard 2.1. <Description>Mongo2Go is a managed wrapper around MongoDB binaries. It targets .NET Framework 4.7.2 and .NET Standard 2.1.
This Nuget package contains the executables of mongod, mongoimport and mongoexport v4.4.4 for Windows, Linux and macOS. This Nuget package contains the executables of mongod, mongoimport and mongoexport v4.4.4 for Windows, Linux and macOS.
Mongo2Go has two use cases: Mongo2Go has two use cases:
1. Providing multiple, temporary and isolated MongoDB databases for integration tests 1. Providing multiple, temporary and isolated MongoDB databases for integration tests
2. Providing a quick to set up MongoDB database for a local developer environment</Description> 2. Providing a quick to set up MongoDB database for a local developer environment</Description>
<Company>HAUS HOPPE - ITS</Company> <Company>HAUS HOPPE - ITS</Company>
<Copyright>Copyright © 2012-2025 Johannes Hoppe and many ❤️ contributors</Copyright> <Copyright>Copyright © 2012-2025 Johannes Hoppe and many ❤️ contributors</Copyright>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageIcon>icon.png</PackageIcon> <PackageIcon>icon.png</PackageIcon>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/Mongo2Go/Mongo2Go</PackageProjectUrl> <PackageProjectUrl>https://github.com/Mongo2Go/Mongo2Go</PackageProjectUrl>
<PackageReleaseNotes>https://github.com/Mongo2Go/Mongo2Go/releases</PackageReleaseNotes> <PackageReleaseNotes>https://github.com/Mongo2Go/Mongo2Go/releases</PackageReleaseNotes>
<PackageTags>MongoDB Mongo unit test integration runner</PackageTags> <PackageTags>MongoDB Mongo unit test integration runner</PackageTags>
<RepositoryUrl>https://github.com/Mongo2Go/Mongo2Go</RepositoryUrl> <RepositoryUrl>https://github.com/Mongo2Go/Mongo2Go</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<AssemblyTitle>Mongo2Go</AssemblyTitle> <AssemblyTitle>Mongo2Go</AssemblyTitle>
<AssemblyDescription>Mongo2Go is a managed wrapper around MongoDB binaries.</AssemblyDescription> <AssemblyDescription>Mongo2Go is a managed wrapper around MongoDB binaries.</AssemblyDescription>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|netstandard2.1|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|netstandard2.1|AnyCPU'">
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<NoWarn>1701;1702;1591;1573</NoWarn> <NoWarn>1701;1702;1591;1573</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|netstandard2.1|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|netstandard2.1|AnyCPU'">
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<NoWarn>1701;1702;1591;1573</NoWarn> <NoWarn>1701;1702;1591;1573</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net48|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net48|AnyCPU'">
<NoWarn>1701;1702;1591;1573</NoWarn> <NoWarn>1701;1702;1591;1573</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net48|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net48|AnyCPU'">
<NoWarn>1701;1702;1591;1573</NoWarn> <NoWarn>1701;1702;1591;1573</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Restoring"> <PropertyGroup Label="Restoring">
<DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder> <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<RestoreLockedMode Condition="$(ContinuousIntegrationBuild) == 'true'">true</RestoreLockedMode> <RestoreLockedMode Condition="$(ContinuousIntegrationBuild) == 'true'">true</RestoreLockedMode>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="SourceLink"> <PropertyGroup Label="SourceLink">
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
<EmbedUntrackedSources>true</EmbedUntrackedSources> <EmbedUntrackedSources>true</EmbedUntrackedSources>
<PublishRepositoryUrl>true</PublishRepositoryUrl> <PublishRepositoryUrl>true</PublishRepositoryUrl>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="MinVer"> <PropertyGroup Label="MinVer">
<MinVerTagPrefix>v</MinVerTagPrefix> <MinVerTagPrefix>v</MinVerTagPrefix>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<None Update="packages.lock.json" Visible="false" /> <None Update="packages.lock.json" Visible="false" />
<None Include="../mongo2go_200_200.png" Visible="false"> <None Include="../mongo2go_200_200.png" Visible="false">
<Pack>true</Pack> <Pack>true</Pack>
<PackagePath>icon.png</PackagePath> <PackagePath>icon.png</PackagePath>
</None> </None>
<None Include="../../tools/mongodb*/**" Visible="false"> <None Include="../../tools/mongodb*/**" Visible="false">
<Pack>true</Pack> <Pack>true</Pack>
<PackagePath>tools</PackagePath> <PackagePath>tools</PackagePath>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" /> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
<PackageReference Include="MinVer" Version="2.5.0" PrivateAssets="all" /> <PackageReference Include="MinVer" Version="2.5.0" PrivateAssets="all" />
<PackageReference Include="MongoDB.Driver" Version="3.5.0" /> <PackageReference Include="MongoDB.Driver" Version="3.5.0" />
<PackageReference Include="SharpCompress" Version="0.41.0" /> <PackageReference Include="SharpCompress" Version="0.41.0" />
<PackageReference Include="System.Text.Json" Version="6.0.10" /> <PackageReference Include="System.Text.Json" Version="6.0.10" />
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" /> <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<InternalsVisibleTo Include="Mongo2GoTests" /> <InternalsVisibleTo Include="Mongo2GoTests" />
</ItemGroup> </ItemGroup>
<Target Name="PrintPackageVersionForGitHubActions" AfterTargets="Pack"> <Target Name="PrintPackageVersionForGitHubActions" AfterTargets="Pack">
<Message Importance="high" Text="version=$(PackageVersion)" /> <Message Importance="high" Text="version=$(PackageVersion)" />
<Message Importance="high" Text="nupkg-filename=$(PackageId).$(PackageVersion).nupkg" /> <Message Importance="high" Text="nupkg-filename=$(PackageId).$(PackageVersion).nupkg" />
</Target> </Target>
</Project> </Project>

View File

@@ -1,22 +1,22 @@
namespace Mongo2Go namespace Mongo2Go
{ {
public static class MongoDbDefaults public static class MongoDbDefaults
{ {
public const string ProcessName = "mongod"; public const string ProcessName = "mongod";
public const string MongodExecutable = "mongod"; public const string MongodExecutable = "mongod";
public const string MongoExportExecutable = "mongoexport"; public const string MongoExportExecutable = "mongoexport";
public const string MongoImportExecutable = "mongoimport"; public const string MongoImportExecutable = "mongoimport";
public const int DefaultPort = 27017; public const int DefaultPort = 27017;
// but we don't want to get in trouble with productive systems // but we don't want to get in trouble with productive systems
public const int TestStartPort = 27018; public const int TestStartPort = 27018;
public const string Lockfile = "mongod.lock"; public const string Lockfile = "mongod.lock";
public const int SingleNodeReplicaSetWaitTimeout = 10; public const int SingleNodeReplicaSetWaitTimeout = 10;
} }
} }

View File

@@ -1,11 +1,11 @@
using System; using System;
namespace Mongo2Go namespace Mongo2Go
{ {
public class MongoDbPortAlreadyTakenException : Exception public class MongoDbPortAlreadyTakenException : Exception
{ {
public MongoDbPortAlreadyTakenException() { } public MongoDbPortAlreadyTakenException() { }
public MongoDbPortAlreadyTakenException(string message) : base(message) { } public MongoDbPortAlreadyTakenException(string message) : base(message) { }
public MongoDbPortAlreadyTakenException(string message, Exception inner) : base(message, inner) { } public MongoDbPortAlreadyTakenException(string message, Exception inner) : base(message, inner) { }
} }
} }

View File

@@ -1,54 +1,54 @@
using System; using System;
namespace Mongo2Go namespace Mongo2Go
{ {
// IDisposable and friends // IDisposable and friends
public partial class MongoDbRunner public partial class MongoDbRunner
{ {
~MongoDbRunner() ~MongoDbRunner()
{ {
Dispose(false); Dispose(false);
} }
public bool Disposed { get; private set; } public bool Disposed { get; private set; }
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
private void Dispose(bool disposing) private void Dispose(bool disposing)
{ {
if (Disposed) if (Disposed)
{ {
return; return;
} }
if (State != State.Running) if (State != State.Running)
{ {
return; return;
} }
if (disposing) if (disposing)
{ {
// we have no "managed resources" - but we leave this switch to avoid an FxCop CA1801 warnig // we have no "managed resources" - but we leave this switch to avoid an FxCop CA1801 warnig
} }
if (_mongoDbProcess != null) if (_mongoDbProcess != null)
{ {
_mongoDbProcess.Dispose(); _mongoDbProcess.Dispose();
} }
// will be null if we are working in debugging mode (single instance) // will be null if we are working in debugging mode (single instance)
if (_dataDirectoryWithPort != null) if (_dataDirectoryWithPort != null)
{ {
// finally clean up the data directory we created previously // finally clean up the data directory we created previously
_fileSystem.DeleteFolder(_dataDirectoryWithPort); _fileSystem.DeleteFolder(_dataDirectoryWithPort);
} }
Disposed = true; Disposed = true;
State = State.Stopped; State = State.Stopped;
} }
} }
} }

View File

@@ -1,221 +1,221 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Mongo2Go.Helper; using Mongo2Go.Helper;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Mongo2Go namespace Mongo2Go
{ {
/// <summary> /// <summary>
/// Mongo2Go main entry point /// Mongo2Go main entry point
/// </summary> /// </summary>
public partial class MongoDbRunner : IDisposable public partial class MongoDbRunner : IDisposable
{ {
private readonly IMongoDbProcess _mongoDbProcess; private readonly IMongoDbProcess _mongoDbProcess;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly string _dataDirectoryWithPort; private readonly string _dataDirectoryWithPort;
private readonly int _port; private readonly int _port;
private readonly IMongoBinaryLocator _mongoBin; private readonly IMongoBinaryLocator _mongoBin;
/// <summary> /// <summary>
/// State of the current MongoDB instance /// State of the current MongoDB instance
/// </summary> /// </summary>
public State State { get; private set; } public State State { get; private set; }
/// <summary> /// <summary>
/// Connections string that should be used to establish a connection the MongoDB instance /// Connections string that should be used to establish a connection the MongoDB instance
/// </summary> /// </summary>
public string ConnectionString { get; private set; } public string ConnectionString { get; private set; }
/// <summary> /// <summary>
/// Starts Multiple MongoDB instances with each call /// Starts Multiple MongoDB instances with each call
/// On dispose: kills them and deletes their data directory /// On dispose: kills them and deletes their data directory
/// </summary> /// </summary>
/// <param name="logger">(Optional) If null, mongod logs are wired to .NET's Console and Debug output (provided you haven't added the --quiet additional argument). /// <param name="logger">(Optional) If null, mongod logs are wired to .NET's Console and Debug output (provided you haven't added the --quiet additional argument).
/// If not null, mongod logs are parsed and wired to the provided logger.</param> /// If not null, mongod logs are parsed and wired to the provided logger.</param>
/// <remarks>Should be used for integration tests</remarks> /// <remarks>Should be used for integration tests</remarks>
public static MongoDbRunner Start(string dataDirectory = null, string binariesSearchPatternOverride = null, string binariesSearchDirectory = null, bool singleNodeReplSet = false, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null) public static MongoDbRunner Start(string dataDirectory = null, string binariesSearchPatternOverride = null, string binariesSearchDirectory = null, bool singleNodeReplSet = false, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null)
{ {
if (dataDirectory == null) { if (dataDirectory == null) {
dataDirectory = GetTemporaryDataDirectory(); dataDirectory = GetTemporaryDataDirectory();
} }
// this is required to support multiple instances to run in parallel // this is required to support multiple instances to run in parallel
dataDirectory += Guid.NewGuid().ToString().Replace("-", "").Substring(0, 20); dataDirectory += Guid.NewGuid().ToString().Replace("-", "").Substring(0, 20);
return new MongoDbRunner( return new MongoDbRunner(
PortPool.GetInstance, PortPool.GetInstance,
new FileSystem(), new FileSystem(),
new MongoDbProcessStarter(), new MongoDbProcessStarter(),
new MongoBinaryLocator(binariesSearchPatternOverride, binariesSearchDirectory), new MongoBinaryLocator(binariesSearchPatternOverride, binariesSearchDirectory),
dataDirectory, dataDirectory,
singleNodeReplSet, singleNodeReplSet,
additionalMongodArguments, additionalMongodArguments,
singleNodeReplSetWaitTimeout, singleNodeReplSetWaitTimeout,
logger); logger);
} }
/// <summary> /// <summary>
/// !!! /// !!!
/// This method is only used for an internal unit test. Use MongoDbRunner.Start() instead. /// This method is only used for an internal unit test. Use MongoDbRunner.Start() instead.
/// But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own! /// But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own!
/// </summary> /// </summary>
/// <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks> /// <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks>
[Obsolete("Use MongoDbRunner.Start() if possible.")] [Obsolete("Use MongoDbRunner.Start() if possible.")]
public static MongoDbRunner StartUnitTest( public static MongoDbRunner StartUnitTest(
IPortPool portPool, IPortPool portPool,
IFileSystem fileSystem, IFileSystem fileSystem,
IMongoDbProcessStarter processStarter, IMongoDbProcessStarter processStarter,
IMongoBinaryLocator mongoBin, IMongoBinaryLocator mongoBin,
string dataDirectory = null, string dataDirectory = null,
string additionalMongodArguments = null) string additionalMongodArguments = null)
{ {
return new MongoDbRunner( return new MongoDbRunner(
portPool, portPool,
fileSystem, fileSystem,
processStarter, processStarter,
mongoBin, mongoBin,
dataDirectory, dataDirectory,
additionalMongodArguments: additionalMongodArguments); additionalMongodArguments: additionalMongodArguments);
} }
/// <summary> /// <summary>
/// Only starts one single MongoDB instance (even on multiple calls), does not kill it, does not delete data /// Only starts one single MongoDB instance (even on multiple calls), does not kill it, does not delete data
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Should be used for local debugging only /// Should be used for local debugging only
/// WARNING: one single instance on one single machine is not a suitable setup for productive environments!!! /// WARNING: one single instance on one single machine is not a suitable setup for productive environments!!!
/// </remarks> /// </remarks>
public static MongoDbRunner StartForDebugging(string dataDirectory = null, string binariesSearchPatternOverride = null, string binariesSearchDirectory = null, bool singleNodeReplSet = false, int port = MongoDbDefaults.DefaultPort, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout) public static MongoDbRunner StartForDebugging(string dataDirectory = null, string binariesSearchPatternOverride = null, string binariesSearchDirectory = null, bool singleNodeReplSet = false, int port = MongoDbDefaults.DefaultPort, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout)
{ {
return new MongoDbRunner( return new MongoDbRunner(
new ProcessWatcher(), new ProcessWatcher(),
new PortWatcher(), new PortWatcher(),
new FileSystem(), new FileSystem(),
new MongoDbProcessStarter(), new MongoDbProcessStarter(),
new MongoBinaryLocator(binariesSearchPatternOverride, binariesSearchDirectory), port, dataDirectory, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout); new MongoBinaryLocator(binariesSearchPatternOverride, binariesSearchDirectory), port, dataDirectory, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout);
} }
/// <summary> /// <summary>
/// !!! /// !!!
/// This method is only used for an internal unit test. Use MongoDbRunner.StartForDebugging() instead. /// This method is only used for an internal unit test. Use MongoDbRunner.StartForDebugging() instead.
/// But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own! /// But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own!
/// </summary> /// </summary>
/// <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks> /// <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks>
[Obsolete("Use MongoDbRunner.StartForDebugging() if possible.")] [Obsolete("Use MongoDbRunner.StartForDebugging() if possible.")]
public static MongoDbRunner StartForDebuggingUnitTest( public static MongoDbRunner StartForDebuggingUnitTest(
IProcessWatcher processWatcher, IProcessWatcher processWatcher,
IPortWatcher portWatcher, IPortWatcher portWatcher,
IFileSystem fileSystem, IFileSystem fileSystem,
IMongoDbProcessStarter processStarter, IMongoDbProcessStarter processStarter,
IMongoBinaryLocator mongoBin, IMongoBinaryLocator mongoBin,
string dataDirectory = null, string dataDirectory = null,
string additionalMongodArguments = null) string additionalMongodArguments = null)
{ {
return new MongoDbRunner( return new MongoDbRunner(
processWatcher, processWatcher,
portWatcher, portWatcher,
fileSystem, fileSystem,
processStarter, processStarter,
mongoBin, mongoBin,
MongoDbDefaults.DefaultPort, MongoDbDefaults.DefaultPort,
dataDirectory, dataDirectory,
additionalMongodArguments: additionalMongodArguments); additionalMongodArguments: additionalMongodArguments);
} }
/// <summary> /// <summary>
/// Executes Mongoimport on the associated MongoDB Instace /// Executes Mongoimport on the associated MongoDB Instace
/// </summary> /// </summary>
public void Import(string database, string collection, string inputFile, bool drop, string additionalMongodArguments = null) public void Import(string database, string collection, string inputFile, bool drop, string additionalMongodArguments = null)
{ {
MongoImportExport.Import(_mongoBin.Directory, _port, database, collection, inputFile, drop, additionalMongodArguments); MongoImportExport.Import(_mongoBin.Directory, _port, database, collection, inputFile, drop, additionalMongodArguments);
} }
/// <summary> /// <summary>
/// Executes Mongoexport on the associated MongoDB Instace /// Executes Mongoexport on the associated MongoDB Instace
/// </summary> /// </summary>
public void Export(string database, string collection, string outputFile, string additionalMongodArguments = null) public void Export(string database, string collection, string outputFile, string additionalMongodArguments = null)
{ {
MongoImportExport.Export(_mongoBin.Directory, _port, database, collection, outputFile, additionalMongodArguments); MongoImportExport.Export(_mongoBin.Directory, _port, database, collection, outputFile, additionalMongodArguments);
} }
/// <summary> /// <summary>
/// usage: local debugging /// usage: local debugging
/// </summary> /// </summary>
private MongoDbRunner(IProcessWatcher processWatcher, IPortWatcher portWatcher, IFileSystem fileSystem, IMongoDbProcessStarter processStarter, IMongoBinaryLocator mongoBin, int port, string dataDirectory = null, bool singleNodeReplSet = false, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout) private MongoDbRunner(IProcessWatcher processWatcher, IPortWatcher portWatcher, IFileSystem fileSystem, IMongoDbProcessStarter processStarter, IMongoBinaryLocator mongoBin, int port, string dataDirectory = null, bool singleNodeReplSet = false, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout)
{ {
_fileSystem = fileSystem; _fileSystem = fileSystem;
_mongoBin = mongoBin; _mongoBin = mongoBin;
_port = port; _port = port;
MakeMongoBinarysExecutable(); MakeMongoBinarysExecutable();
ConnectionString = singleNodeReplSet ConnectionString = singleNodeReplSet
? "mongodb://127.0.0.1:{0}/?directConnection=true&replicaSet=singleNodeReplSet&readPreference=primary".Formatted(_port) ? "mongodb://127.0.0.1:{0}/?directConnection=true&replicaSet=singleNodeReplSet&readPreference=primary".Formatted(_port)
: "mongodb://127.0.0.1:{0}/".Formatted(_port); : "mongodb://127.0.0.1:{0}/".Formatted(_port);
if (processWatcher.IsProcessRunning(MongoDbDefaults.ProcessName) && !portWatcher.IsPortAvailable(_port)) if (processWatcher.IsProcessRunning(MongoDbDefaults.ProcessName) && !portWatcher.IsPortAvailable(_port))
{ {
State = State.AlreadyRunning; State = State.AlreadyRunning;
return; return;
} }
if (!portWatcher.IsPortAvailable(_port)) if (!portWatcher.IsPortAvailable(_port))
{ {
throw new MongoDbPortAlreadyTakenException("MongoDB can't be started. The TCP port {0} is already taken.".Formatted(_port)); throw new MongoDbPortAlreadyTakenException("MongoDB can't be started. The TCP port {0} is already taken.".Formatted(_port));
} }
if (dataDirectory == null) { if (dataDirectory == null) {
dataDirectory = GetTemporaryDataDirectory(); dataDirectory = GetTemporaryDataDirectory();
} }
_fileSystem.CreateFolder(dataDirectory); _fileSystem.CreateFolder(dataDirectory);
_fileSystem.DeleteFile("{0}{1}{2}".Formatted(dataDirectory, Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.Lockfile)); _fileSystem.DeleteFile("{0}{1}{2}".Formatted(dataDirectory, Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.Lockfile));
_mongoDbProcess = processStarter.Start(_mongoBin.Directory, dataDirectory, _port, true, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout); _mongoDbProcess = processStarter.Start(_mongoBin.Directory, dataDirectory, _port, true, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout);
State = State.Running; State = State.Running;
} }
/// <summary> /// <summary>
/// usage: integration tests /// usage: integration tests
/// </summary> /// </summary>
private MongoDbRunner(IPortPool portPool, IFileSystem fileSystem, IMongoDbProcessStarter processStarter, IMongoBinaryLocator mongoBin, string dataDirectory = null, bool singleNodeReplSet = false, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null) private MongoDbRunner(IPortPool portPool, IFileSystem fileSystem, IMongoDbProcessStarter processStarter, IMongoBinaryLocator mongoBin, string dataDirectory = null, bool singleNodeReplSet = false, string additionalMongodArguments = null, ushort singleNodeReplSetWaitTimeout = MongoDbDefaults.SingleNodeReplicaSetWaitTimeout, ILogger logger = null)
{ {
_fileSystem = fileSystem; _fileSystem = fileSystem;
_port = portPool.GetNextOpenPort(); _port = portPool.GetNextOpenPort();
_mongoBin = mongoBin; _mongoBin = mongoBin;
if (dataDirectory == null) { if (dataDirectory == null) {
dataDirectory = GetTemporaryDataDirectory(); dataDirectory = GetTemporaryDataDirectory();
} }
MakeMongoBinarysExecutable(); MakeMongoBinarysExecutable();
ConnectionString = singleNodeReplSet ConnectionString = singleNodeReplSet
? "mongodb://127.0.0.1:{0}/?directConnection=true&replicaSet=singleNodeReplSet&readPreference=primary".Formatted(_port) ? "mongodb://127.0.0.1:{0}/?directConnection=true&replicaSet=singleNodeReplSet&readPreference=primary".Formatted(_port)
: "mongodb://127.0.0.1:{0}/".Formatted(_port); : "mongodb://127.0.0.1:{0}/".Formatted(_port);
_dataDirectoryWithPort = "{0}_{1}".Formatted(dataDirectory, _port); _dataDirectoryWithPort = "{0}_{1}".Formatted(dataDirectory, _port);
_fileSystem.CreateFolder(_dataDirectoryWithPort); _fileSystem.CreateFolder(_dataDirectoryWithPort);
_fileSystem.DeleteFile("{0}{1}{2}".Formatted(_dataDirectoryWithPort, Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.Lockfile)); _fileSystem.DeleteFile("{0}{1}{2}".Formatted(_dataDirectoryWithPort, Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.Lockfile));
_mongoDbProcess = processStarter.Start(_mongoBin.Directory, _dataDirectoryWithPort, _port, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout, logger); _mongoDbProcess = processStarter.Start(_mongoBin.Directory, _dataDirectoryWithPort, _port, singleNodeReplSet, additionalMongodArguments, singleNodeReplSetWaitTimeout, logger);
State = State.Running; State = State.Running;
} }
private void MakeMongoBinarysExecutable() private void MakeMongoBinarysExecutable()
{ {
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ||
RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{ {
_fileSystem.MakeFileExecutable(Path.Combine(_mongoBin.Directory, MongoDbDefaults.MongodExecutable)); _fileSystem.MakeFileExecutable(Path.Combine(_mongoBin.Directory, MongoDbDefaults.MongodExecutable));
_fileSystem.MakeFileExecutable(Path.Combine(_mongoBin.Directory, MongoDbDefaults.MongoExportExecutable)); _fileSystem.MakeFileExecutable(Path.Combine(_mongoBin.Directory, MongoDbDefaults.MongoExportExecutable));
_fileSystem.MakeFileExecutable(Path.Combine(_mongoBin.Directory, MongoDbDefaults.MongoImportExecutable)); _fileSystem.MakeFileExecutable(Path.Combine(_mongoBin.Directory, MongoDbDefaults.MongoImportExecutable));
} }
} }
private static string GetTemporaryDataDirectory() => Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); private static string GetTemporaryDataDirectory() => Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
} }
} }

View File

@@ -1,11 +1,11 @@
using System; using System;
namespace Mongo2Go namespace Mongo2Go
{ {
public class MonogDbBinariesNotFoundException : Exception public class MonogDbBinariesNotFoundException : Exception
{ {
public MonogDbBinariesNotFoundException() { } public MonogDbBinariesNotFoundException() { }
public MonogDbBinariesNotFoundException(string message) : base(message) { } public MonogDbBinariesNotFoundException(string message) : base(message) { }
public MonogDbBinariesNotFoundException(string message, Exception inner) : base(message, inner) { } public MonogDbBinariesNotFoundException(string message, Exception inner) : base(message, inner) { }
} }
} }

View File

@@ -1,9 +1,9 @@
namespace Mongo2Go namespace Mongo2Go
{ {
public enum State public enum State
{ {
Stopped, Stopped,
Running, Running,
AlreadyRunning AlreadyRunning
} }
} }

View File

@@ -1,490 +1,490 @@
{ {
"version": 1, "version": 1,
"dependencies": { "dependencies": {
".NETFramework,Version=v4.7.2": { ".NETFramework,Version=v4.7.2": {
"Microsoft.Extensions.Logging.Abstractions": { "Microsoft.Extensions.Logging.Abstractions": {
"type": "Direct", "type": "Direct",
"requested": "[6.0.0, )", "requested": "[6.0.0, )",
"resolved": "6.0.0", "resolved": "6.0.0",
"contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==", "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==",
"dependencies": { "dependencies": {
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4" "System.Memory": "4.5.4"
} }
}, },
"Microsoft.NETFramework.ReferenceAssemblies": { "Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct", "type": "Direct",
"requested": "[1.0.3, )", "requested": "[1.0.3, )",
"resolved": "1.0.3", "resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": { "dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.3" "Microsoft.NETFramework.ReferenceAssemblies.net472": "1.0.3"
} }
}, },
"Microsoft.SourceLink.GitHub": { "Microsoft.SourceLink.GitHub": {
"type": "Direct", "type": "Direct",
"requested": "[1.0.0, )", "requested": "[1.0.0, )",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==", "contentHash": "aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==",
"dependencies": { "dependencies": {
"Microsoft.Build.Tasks.Git": "1.0.0", "Microsoft.Build.Tasks.Git": "1.0.0",
"Microsoft.SourceLink.Common": "1.0.0" "Microsoft.SourceLink.Common": "1.0.0"
} }
}, },
"MinVer": { "MinVer": {
"type": "Direct", "type": "Direct",
"requested": "[2.5.0, )", "requested": "[2.5.0, )",
"resolved": "2.5.0", "resolved": "2.5.0",
"contentHash": "+vgY+COxnu93nZEVYScloRuboNRIYkElokxTdtKLt6isr/f6GllPt0oLfrHj7fzxgj7SC5xMZg5c2qvd6qyHDQ==" "contentHash": "+vgY+COxnu93nZEVYScloRuboNRIYkElokxTdtKLt6isr/f6GllPt0oLfrHj7fzxgj7SC5xMZg5c2qvd6qyHDQ=="
}, },
"MongoDB.Driver": { "MongoDB.Driver": {
"type": "Direct", "type": "Direct",
"requested": "[3.5.0, )", "requested": "[3.5.0, )",
"resolved": "3.5.0", "resolved": "3.5.0",
"contentHash": "ST90u7psyMkNNOWFgSkexsrB3kPn7Ynl2DlMFj2rJyYuc6SIxjmzu4ufy51yzM+cPVE1SvVcdb5UFobrRw6cMg==", "contentHash": "ST90u7psyMkNNOWFgSkexsrB3kPn7Ynl2DlMFj2rJyYuc6SIxjmzu4ufy51yzM+cPVE1SvVcdb5UFobrRw6cMg==",
"dependencies": { "dependencies": {
"DnsClient": "1.6.1", "DnsClient": "1.6.1",
"Microsoft.Extensions.Logging.Abstractions": "2.0.0", "Microsoft.Extensions.Logging.Abstractions": "2.0.0",
"MongoDB.Bson": "3.5.0", "MongoDB.Bson": "3.5.0",
"SharpCompress": "0.30.1", "SharpCompress": "0.30.1",
"Snappier": "1.0.0", "Snappier": "1.0.0",
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Net.Http": "4.3.4", "System.Net.Http": "4.3.4",
"System.Runtime.InteropServices.RuntimeInformation": "4.3.0", "System.Runtime.InteropServices.RuntimeInformation": "4.3.0",
"ZstdSharp.Port": "0.7.3" "ZstdSharp.Port": "0.7.3"
} }
}, },
"SharpCompress": { "SharpCompress": {
"type": "Direct", "type": "Direct",
"requested": "[0.41.0, )", "requested": "[0.41.0, )",
"resolved": "0.41.0", "resolved": "0.41.0",
"contentHash": "z04dBVdTIAFTRKi38f0LkajaKA++bR+M8kYCbasXePILD2H+qs7CkLpyiippB24CSbTrWIgpBKm6BenZqkUwvw==", "contentHash": "z04dBVdTIAFTRKi38f0LkajaKA++bR+M8kYCbasXePILD2H+qs7CkLpyiippB24CSbTrWIgpBKm6BenZqkUwvw==",
"dependencies": { "dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0", "Microsoft.Bcl.AsyncInterfaces": "8.0.0",
"System.Buffers": "4.6.0", "System.Buffers": "4.6.0",
"System.Memory": "4.6.0", "System.Memory": "4.6.0",
"System.Text.Encoding.CodePages": "8.0.0", "System.Text.Encoding.CodePages": "8.0.0",
"ZstdSharp.Port": "0.8.6" "ZstdSharp.Port": "0.8.6"
} }
}, },
"System.Text.Json": { "System.Text.Json": {
"type": "Direct", "type": "Direct",
"requested": "[6.0.10, )", "requested": "[6.0.10, )",
"resolved": "6.0.10", "resolved": "6.0.10",
"contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==", "contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==",
"dependencies": { "dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.AsyncInterfaces": "6.0.0",
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4", "System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0", "System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Runtime.CompilerServices.Unsafe": "6.0.0",
"System.Text.Encodings.Web": "6.0.0", "System.Text.Encodings.Web": "6.0.0",
"System.Threading.Tasks.Extensions": "4.5.4", "System.Threading.Tasks.Extensions": "4.5.4",
"System.ValueTuple": "4.5.0" "System.ValueTuple": "4.5.0"
} }
}, },
"DnsClient": { "DnsClient": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.6.1", "resolved": "1.6.1",
"contentHash": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==", "contentHash": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==",
"dependencies": { "dependencies": {
"Microsoft.Win32.Registry": "5.0.0", "Microsoft.Win32.Registry": "5.0.0",
"System.Buffers": "4.5.1" "System.Buffers": "4.5.1"
} }
}, },
"Microsoft.Bcl.AsyncInterfaces": { "Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.0.0", "resolved": "8.0.0",
"contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==",
"dependencies": { "dependencies": {
"System.Threading.Tasks.Extensions": "4.5.4" "System.Threading.Tasks.Extensions": "4.5.4"
} }
}, },
"Microsoft.Build.Tasks.Git": { "Microsoft.Build.Tasks.Git": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ==" "contentHash": "z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ=="
}, },
"Microsoft.NETFramework.ReferenceAssemblies.net472": { "Microsoft.NETFramework.ReferenceAssemblies.net472": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.3", "resolved": "1.0.3",
"contentHash": "0E7evZXHXaDYYiLRfpyXvCh+yzM2rNTyuZDI+ZO7UUqSc6GfjePiXTdqJGtgIKUwdI81tzQKmaWprnUiPj9hAw==" "contentHash": "0E7evZXHXaDYYiLRfpyXvCh+yzM2rNTyuZDI+ZO7UUqSc6GfjePiXTdqJGtgIKUwdI81tzQKmaWprnUiPj9hAw=="
}, },
"Microsoft.SourceLink.Common": { "Microsoft.SourceLink.Common": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg==" "contentHash": "G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg=="
}, },
"Microsoft.Win32.Registry": { "Microsoft.Win32.Registry": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
"contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"dependencies": { "dependencies": {
"System.Security.AccessControl": "5.0.0", "System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0" "System.Security.Principal.Windows": "5.0.0"
} }
}, },
"MongoDB.Bson": { "MongoDB.Bson": {
"type": "Transitive", "type": "Transitive",
"resolved": "3.5.0", "resolved": "3.5.0",
"contentHash": "JGNK6BanLDEifgkvPLqVFCPus5EDCy416pxf1dxUBRSVd3D9+NB3AvMVX190eXlk5/UXuCxpsQv7jWfNKvppBQ==", "contentHash": "JGNK6BanLDEifgkvPLqVFCPus5EDCy416pxf1dxUBRSVd3D9+NB3AvMVX190eXlk5/UXuCxpsQv7jWfNKvppBQ==",
"dependencies": { "dependencies": {
"System.Memory": "4.5.5", "System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "5.0.0" "System.Runtime.CompilerServices.Unsafe": "5.0.0"
} }
}, },
"Snappier": { "Snappier": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==", "contentHash": "rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==",
"dependencies": { "dependencies": {
"System.Memory": "4.5.4", "System.Memory": "4.5.4",
"System.Runtime.CompilerServices.Unsafe": "4.7.1", "System.Runtime.CompilerServices.Unsafe": "4.7.1",
"System.Threading.Tasks.Extensions": "4.5.4" "System.Threading.Tasks.Extensions": "4.5.4"
} }
}, },
"System.Buffers": { "System.Buffers": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.6.0",
"contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA=="
}, },
"System.IO": { "System.IO": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==" "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg=="
}, },
"System.Memory": { "System.Memory": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.6.0",
"contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==", "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==",
"dependencies": { "dependencies": {
"System.Buffers": "4.6.0", "System.Buffers": "4.6.0",
"System.Numerics.Vectors": "4.6.0", "System.Numerics.Vectors": "4.6.0",
"System.Runtime.CompilerServices.Unsafe": "6.1.0" "System.Runtime.CompilerServices.Unsafe": "6.1.0"
} }
}, },
"System.Net.Http": { "System.Net.Http": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.4", "resolved": "4.3.4",
"contentHash": "aOa2d51SEbmM+H+Csw7yJOuNZoHkrP2XnAurye5HWYgGVVU54YZDvsLUYRv6h18X3sPnjNCANmN7ZhIPiqMcjA==", "contentHash": "aOa2d51SEbmM+H+Csw7yJOuNZoHkrP2XnAurye5HWYgGVVU54YZDvsLUYRv6h18X3sPnjNCANmN7ZhIPiqMcjA==",
"dependencies": { "dependencies": {
"System.Security.Cryptography.X509Certificates": "4.3.0" "System.Security.Cryptography.X509Certificates": "4.3.0"
} }
}, },
"System.Numerics.Vectors": { "System.Numerics.Vectors": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.6.0",
"contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg==" "contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg=="
}, },
"System.Runtime": { "System.Runtime": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==" "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw=="
}, },
"System.Runtime.CompilerServices.Unsafe": { "System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.1.0", "resolved": "6.1.0",
"contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg=="
}, },
"System.Runtime.InteropServices.RuntimeInformation": { "System.Runtime.InteropServices.RuntimeInformation": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==" "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw=="
}, },
"System.Security.AccessControl": { "System.Security.AccessControl": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
"contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"dependencies": { "dependencies": {
"System.Security.Principal.Windows": "5.0.0" "System.Security.Principal.Windows": "5.0.0"
} }
}, },
"System.Security.Cryptography.Algorithms": { "System.Security.Cryptography.Algorithms": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
"dependencies": { "dependencies": {
"System.IO": "4.3.0", "System.IO": "4.3.0",
"System.Runtime": "4.3.0", "System.Runtime": "4.3.0",
"System.Security.Cryptography.Encoding": "4.3.0", "System.Security.Cryptography.Encoding": "4.3.0",
"System.Security.Cryptography.Primitives": "4.3.0" "System.Security.Cryptography.Primitives": "4.3.0"
} }
}, },
"System.Security.Cryptography.Encoding": { "System.Security.Cryptography.Encoding": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==" "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw=="
}, },
"System.Security.Cryptography.Primitives": { "System.Security.Cryptography.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==" "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg=="
}, },
"System.Security.Cryptography.X509Certificates": { "System.Security.Cryptography.X509Certificates": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
"contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
"dependencies": { "dependencies": {
"System.Security.Cryptography.Algorithms": "4.3.0", "System.Security.Cryptography.Algorithms": "4.3.0",
"System.Security.Cryptography.Encoding": "4.3.0" "System.Security.Cryptography.Encoding": "4.3.0"
} }
}, },
"System.Security.Principal.Windows": { "System.Security.Principal.Windows": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
"contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
}, },
"System.Text.Encoding.CodePages": { "System.Text.Encoding.CodePages": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.0.0", "resolved": "8.0.0",
"contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==", "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==",
"dependencies": { "dependencies": {
"System.Memory": "4.5.5", "System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
}, },
"System.Text.Encodings.Web": { "System.Text.Encodings.Web": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
"contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
"dependencies": { "dependencies": {
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4", "System.Memory": "4.5.4",
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
}, },
"System.Threading.Tasks.Extensions": { "System.Threading.Tasks.Extensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.5.4", "resolved": "4.5.4",
"contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==",
"dependencies": { "dependencies": {
"System.Runtime.CompilerServices.Unsafe": "4.5.3" "System.Runtime.CompilerServices.Unsafe": "4.5.3"
} }
}, },
"System.ValueTuple": { "System.ValueTuple": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.5.0", "resolved": "4.5.0",
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
}, },
"ZstdSharp.Port": { "ZstdSharp.Port": {
"type": "Transitive", "type": "Transitive",
"resolved": "0.8.6", "resolved": "0.8.6",
"contentHash": "iP4jVLQoQmUjMU88g1WObiNr6YKZGvh4aOXn3yOJsHqZsflwRsxZPcIBvNXgjXO3vQKSLctXGLTpcBPLnWPS8A==", "contentHash": "iP4jVLQoQmUjMU88g1WObiNr6YKZGvh4aOXn3yOJsHqZsflwRsxZPcIBvNXgjXO3vQKSLctXGLTpcBPLnWPS8A==",
"dependencies": { "dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "5.0.0", "Microsoft.Bcl.AsyncInterfaces": "5.0.0",
"System.Memory": "4.5.5", "System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
} }
}, },
".NETStandard,Version=v2.1": { ".NETStandard,Version=v2.1": {
"Microsoft.Extensions.Logging.Abstractions": { "Microsoft.Extensions.Logging.Abstractions": {
"type": "Direct", "type": "Direct",
"requested": "[6.0.0, )", "requested": "[6.0.0, )",
"resolved": "6.0.0", "resolved": "6.0.0",
"contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==", "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==",
"dependencies": { "dependencies": {
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4" "System.Memory": "4.5.4"
} }
}, },
"Microsoft.NETFramework.ReferenceAssemblies": { "Microsoft.NETFramework.ReferenceAssemblies": {
"type": "Direct", "type": "Direct",
"requested": "[1.0.3, )", "requested": "[1.0.3, )",
"resolved": "1.0.3", "resolved": "1.0.3",
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"dependencies": { "dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3" "Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3"
} }
}, },
"Microsoft.SourceLink.GitHub": { "Microsoft.SourceLink.GitHub": {
"type": "Direct", "type": "Direct",
"requested": "[1.0.0, )", "requested": "[1.0.0, )",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==", "contentHash": "aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==",
"dependencies": { "dependencies": {
"Microsoft.Build.Tasks.Git": "1.0.0", "Microsoft.Build.Tasks.Git": "1.0.0",
"Microsoft.SourceLink.Common": "1.0.0" "Microsoft.SourceLink.Common": "1.0.0"
} }
}, },
"MinVer": { "MinVer": {
"type": "Direct", "type": "Direct",
"requested": "[2.5.0, )", "requested": "[2.5.0, )",
"resolved": "2.5.0", "resolved": "2.5.0",
"contentHash": "+vgY+COxnu93nZEVYScloRuboNRIYkElokxTdtKLt6isr/f6GllPt0oLfrHj7fzxgj7SC5xMZg5c2qvd6qyHDQ==" "contentHash": "+vgY+COxnu93nZEVYScloRuboNRIYkElokxTdtKLt6isr/f6GllPt0oLfrHj7fzxgj7SC5xMZg5c2qvd6qyHDQ=="
}, },
"MongoDB.Driver": { "MongoDB.Driver": {
"type": "Direct", "type": "Direct",
"requested": "[3.5.0, )", "requested": "[3.5.0, )",
"resolved": "3.5.0", "resolved": "3.5.0",
"contentHash": "ST90u7psyMkNNOWFgSkexsrB3kPn7Ynl2DlMFj2rJyYuc6SIxjmzu4ufy51yzM+cPVE1SvVcdb5UFobrRw6cMg==", "contentHash": "ST90u7psyMkNNOWFgSkexsrB3kPn7Ynl2DlMFj2rJyYuc6SIxjmzu4ufy51yzM+cPVE1SvVcdb5UFobrRw6cMg==",
"dependencies": { "dependencies": {
"DnsClient": "1.6.1", "DnsClient": "1.6.1",
"Microsoft.Extensions.Logging.Abstractions": "2.0.0", "Microsoft.Extensions.Logging.Abstractions": "2.0.0",
"MongoDB.Bson": "3.5.0", "MongoDB.Bson": "3.5.0",
"SharpCompress": "0.30.1", "SharpCompress": "0.30.1",
"Snappier": "1.0.0", "Snappier": "1.0.0",
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"ZstdSharp.Port": "0.7.3" "ZstdSharp.Port": "0.7.3"
} }
}, },
"SharpCompress": { "SharpCompress": {
"type": "Direct", "type": "Direct",
"requested": "[0.41.0, )", "requested": "[0.41.0, )",
"resolved": "0.41.0", "resolved": "0.41.0",
"contentHash": "z04dBVdTIAFTRKi38f0LkajaKA++bR+M8kYCbasXePILD2H+qs7CkLpyiippB24CSbTrWIgpBKm6BenZqkUwvw==", "contentHash": "z04dBVdTIAFTRKi38f0LkajaKA++bR+M8kYCbasXePILD2H+qs7CkLpyiippB24CSbTrWIgpBKm6BenZqkUwvw==",
"dependencies": { "dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0", "Microsoft.Bcl.AsyncInterfaces": "8.0.0",
"System.Buffers": "4.6.0", "System.Buffers": "4.6.0",
"System.Memory": "4.6.0", "System.Memory": "4.6.0",
"System.Text.Encoding.CodePages": "8.0.0", "System.Text.Encoding.CodePages": "8.0.0",
"ZstdSharp.Port": "0.8.6" "ZstdSharp.Port": "0.8.6"
} }
}, },
"System.Text.Json": { "System.Text.Json": {
"type": "Direct", "type": "Direct",
"requested": "[6.0.10, )", "requested": "[6.0.10, )",
"resolved": "6.0.10", "resolved": "6.0.10",
"contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==", "contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==",
"dependencies": { "dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.AsyncInterfaces": "6.0.0",
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4", "System.Memory": "4.5.4",
"System.Numerics.Vectors": "4.5.0", "System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Runtime.CompilerServices.Unsafe": "6.0.0",
"System.Text.Encodings.Web": "6.0.0", "System.Text.Encodings.Web": "6.0.0",
"System.Threading.Tasks.Extensions": "4.5.4" "System.Threading.Tasks.Extensions": "4.5.4"
} }
}, },
"DnsClient": { "DnsClient": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.6.1", "resolved": "1.6.1",
"contentHash": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==", "contentHash": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==",
"dependencies": { "dependencies": {
"Microsoft.Win32.Registry": "5.0.0" "Microsoft.Win32.Registry": "5.0.0"
} }
}, },
"Microsoft.Bcl.AsyncInterfaces": { "Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.0.0", "resolved": "8.0.0",
"contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw=="
}, },
"Microsoft.Build.Tasks.Git": { "Microsoft.Build.Tasks.Git": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ==" "contentHash": "z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ=="
}, },
"Microsoft.NETFramework.ReferenceAssemblies.net461": { "Microsoft.NETFramework.ReferenceAssemblies.net461": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.3", "resolved": "1.0.3",
"contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA==" "contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA=="
}, },
"Microsoft.SourceLink.Common": { "Microsoft.SourceLink.Common": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg==" "contentHash": "G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg=="
}, },
"Microsoft.Win32.Registry": { "Microsoft.Win32.Registry": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
"contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"dependencies": { "dependencies": {
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4", "System.Memory": "4.5.4",
"System.Security.AccessControl": "5.0.0", "System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0" "System.Security.Principal.Windows": "5.0.0"
} }
}, },
"MongoDB.Bson": { "MongoDB.Bson": {
"type": "Transitive", "type": "Transitive",
"resolved": "3.5.0", "resolved": "3.5.0",
"contentHash": "JGNK6BanLDEifgkvPLqVFCPus5EDCy416pxf1dxUBRSVd3D9+NB3AvMVX190eXlk5/UXuCxpsQv7jWfNKvppBQ==", "contentHash": "JGNK6BanLDEifgkvPLqVFCPus5EDCy416pxf1dxUBRSVd3D9+NB3AvMVX190eXlk5/UXuCxpsQv7jWfNKvppBQ==",
"dependencies": { "dependencies": {
"System.Memory": "4.5.5", "System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "5.0.0" "System.Runtime.CompilerServices.Unsafe": "5.0.0"
} }
}, },
"Snappier": { "Snappier": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.0.0", "resolved": "1.0.0",
"contentHash": "rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==", "contentHash": "rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==",
"dependencies": { "dependencies": {
"System.Runtime.CompilerServices.Unsafe": "4.7.1" "System.Runtime.CompilerServices.Unsafe": "4.7.1"
} }
}, },
"System.Buffers": { "System.Buffers": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.6.0",
"contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA=="
}, },
"System.Memory": { "System.Memory": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.6.0",
"contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==", "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==",
"dependencies": { "dependencies": {
"System.Buffers": "4.6.0", "System.Buffers": "4.6.0",
"System.Numerics.Vectors": "4.6.0", "System.Numerics.Vectors": "4.6.0",
"System.Runtime.CompilerServices.Unsafe": "6.1.0" "System.Runtime.CompilerServices.Unsafe": "6.1.0"
} }
}, },
"System.Numerics.Vectors": { "System.Numerics.Vectors": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.6.0", "resolved": "4.6.0",
"contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg==" "contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg=="
}, },
"System.Runtime.CompilerServices.Unsafe": { "System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.1.0", "resolved": "6.1.0",
"contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg=="
}, },
"System.Security.AccessControl": { "System.Security.AccessControl": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
"contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"dependencies": { "dependencies": {
"System.Security.Principal.Windows": "5.0.0" "System.Security.Principal.Windows": "5.0.0"
} }
}, },
"System.Security.Principal.Windows": { "System.Security.Principal.Windows": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.0", "resolved": "5.0.0",
"contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
}, },
"System.Text.Encoding.CodePages": { "System.Text.Encoding.CodePages": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.0.0", "resolved": "8.0.0",
"contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==", "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==",
"dependencies": { "dependencies": {
"System.Memory": "4.5.5", "System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
}, },
"System.Text.Encodings.Web": { "System.Text.Encodings.Web": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.0", "resolved": "6.0.0",
"contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
"dependencies": { "dependencies": {
"System.Buffers": "4.5.1", "System.Buffers": "4.5.1",
"System.Memory": "4.5.4", "System.Memory": "4.5.4",
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
}, },
"System.Threading.Tasks.Extensions": { "System.Threading.Tasks.Extensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.5.4", "resolved": "4.5.4",
"contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==",
"dependencies": { "dependencies": {
"System.Runtime.CompilerServices.Unsafe": "4.5.3" "System.Runtime.CompilerServices.Unsafe": "4.5.3"
} }
}, },
"ZstdSharp.Port": { "ZstdSharp.Port": {
"type": "Transitive", "type": "Transitive",
"resolved": "0.8.6", "resolved": "0.8.6",
"contentHash": "iP4jVLQoQmUjMU88g1WObiNr6YKZGvh4aOXn3yOJsHqZsflwRsxZPcIBvNXgjXO3vQKSLctXGLTpcBPLnWPS8A==", "contentHash": "iP4jVLQoQmUjMU88g1WObiNr6YKZGvh4aOXn3yOJsHqZsflwRsxZPcIBvNXgjXO3vQKSLctXGLTpcBPLnWPS8A==",
"dependencies": { "dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
} }
} }
} }
} }

View File

@@ -1,146 +1,146 @@
using System; using System;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using FluentAssertions; using FluentAssertions;
using Machine.Specifications; using Machine.Specifications;
using Mongo2Go.Helper; using Mongo2Go.Helper;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable UnusedMember.Local // ReSharper disable UnusedMember.Local
namespace Mongo2GoTests namespace Mongo2GoTests
{ {
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_requesting_current_executing_directory public class when_requesting_current_executing_directory
{ {
public static string directory; public static string directory;
Because of = () => directory = FolderSearch.CurrentExecutingDirectory(); Because of = () => directory = FolderSearch.CurrentExecutingDirectory();
It should_contain_correct_path = () => directory.Should().Contain(Path.Combine("Mongo2GoTests", "bin")); It should_contain_correct_path = () => directory.Should().Contain(Path.Combine("Mongo2GoTests", "bin"));
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_searching_for_folder : FolderSearchSpec public class when_searching_for_folder : FolderSearchSpec
{ {
static string startDirectory = Path.Combine(BaseDir, "test1", "test2"); static string startDirectory = Path.Combine(BaseDir, "test1", "test2");
static string searchPattern = Path.Combine("packages", "Mongo2Go*", "tools", "mongodb-win32-i386*", "bin"); static string searchPattern = Path.Combine("packages", "Mongo2Go*", "tools", "mongodb-win32-i386*", "bin");
static string directory; static string directory;
Because of = () => directory = startDirectory.FindFolder(searchPattern); Because of = () => directory = startDirectory.FindFolder(searchPattern);
It should_find_the_path_with_the_highest_version_number = () => directory.Should().Be(MongoBinaries); It should_find_the_path_with_the_highest_version_number = () => directory.Should().Be(MongoBinaries);
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_searching_for_not_existing_folder : FolderSearchSpec public class when_searching_for_not_existing_folder : FolderSearchSpec
{ {
static string startDirectory = Path.Combine(BaseDir, "test1", "test2"); static string startDirectory = Path.Combine(BaseDir, "test1", "test2");
static string searchPattern = Path.Combine("packages", "Mongo2Go*", "XXX", "mongodb-win32-i386*", "bin"); static string searchPattern = Path.Combine("packages", "Mongo2Go*", "XXX", "mongodb-win32-i386*", "bin");
static string directory; static string directory;
Because of = () => directory = startDirectory.FindFolder(searchPattern); Because of = () => directory = startDirectory.FindFolder(searchPattern);
It should_return_null = () => directory.Should().BeNull(); It should_return_null = () => directory.Should().BeNull();
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_searching_for_not_existing_start_dir : FolderSearchSpec public class when_searching_for_not_existing_start_dir : FolderSearchSpec
{ {
static string startDirectory = Path.Combine(Path.GetRandomFileName()); static string startDirectory = Path.Combine(Path.GetRandomFileName());
static string searchPattern = Path.Combine("packages", "Mongo2Go*", "XXX", "mongodb-win32-i386*", "bin"); static string searchPattern = Path.Combine("packages", "Mongo2Go*", "XXX", "mongodb-win32-i386*", "bin");
static string directory; static string directory;
Because of = () => directory = startDirectory.FindFolder(searchPattern); Because of = () => directory = startDirectory.FindFolder(searchPattern);
It should_return_null = () => directory.Should().BeNull(); It should_return_null = () => directory.Should().BeNull();
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_searching_for_folder_upwards : FolderSearchSpec public class when_searching_for_folder_upwards : FolderSearchSpec
{ {
static string searchPattern = Path.Combine("packages", "Mongo2Go*", "tools", "mongodb-win32-i386*", "bin"); static string searchPattern = Path.Combine("packages", "Mongo2Go*", "tools", "mongodb-win32-i386*", "bin");
static string directory; static string directory;
Because of = () => directory = LocationOfAssembly.FindFolderUpwards(searchPattern); Because of = () => directory = LocationOfAssembly.FindFolderUpwards(searchPattern);
It should_find_the_path_with_the_highest_version_number = () => directory.Should().Be(MongoBinaries); It should_find_the_path_with_the_highest_version_number = () => directory.Should().Be(MongoBinaries);
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_searching_for_not_existing_folder_upwards : FolderSearchSpec public class when_searching_for_not_existing_folder_upwards : FolderSearchSpec
{ {
static string searchPattern = Path.Combine("packages", "Mongo2Go*", "XXX", "mongodb-win32-i386*", "bin"); static string searchPattern = Path.Combine("packages", "Mongo2Go*", "XXX", "mongodb-win32-i386*", "bin");
static string directory; static string directory;
Because of = () => directory = LocationOfAssembly.FindFolderUpwards(searchPattern); Because of = () => directory = LocationOfAssembly.FindFolderUpwards(searchPattern);
It should_return_null = () => directory.Should().BeNull(); It should_return_null = () => directory.Should().BeNull();
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_remove_last_part_of_path public class when_remove_last_part_of_path
{ {
static string directory; static string directory;
Because of = () => directory = Path.Combine("test1", "test2", "test3").RemoveLastPart(); Because of = () => directory = Path.Combine("test1", "test2", "test3").RemoveLastPart();
It should_remove_the_element = () => directory.Should().Be(Path.Combine("test1", "test2")); It should_remove_the_element = () => directory.Should().Be(Path.Combine("test1", "test2"));
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_remove_last_part_of_single_element_path public class when_remove_last_part_of_single_element_path
{ {
static string directory; static string directory;
Because of = () => directory = "test1".RemoveLastPart(); Because of = () => directory = "test1".RemoveLastPart();
It should_return_null = () => directory.Should().BeNull(); It should_return_null = () => directory.Should().BeNull();
} }
[Subject("FolderSearch")] [Subject("FolderSearch")]
public class when_directory_contains_multiple_versions_mongo2go public class when_directory_contains_multiple_versions_mongo2go
{ {
private readonly string[] directories; private readonly string[] directories;
private static string getAssemblyVersion() private static string getAssemblyVersion()
{ {
// ReSharper disable once PossibleNullReferenceException // ReSharper disable once PossibleNullReferenceException
return typeof(FolderSearch).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; return typeof(FolderSearch).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
} }
public when_directory_contains_multiple_versions_mongo2go() public when_directory_contains_multiple_versions_mongo2go()
{ {
// setup some directories // setup some directories
directories = new[] directories = new[]
{ {
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, getAssemblyVersion() + "a"), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, getAssemblyVersion() + "a"),
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2.2.9"), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2.2.9"),
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, getAssemblyVersion()) Path.Combine(AppDomain.CurrentDomain.BaseDirectory, getAssemblyVersion())
}; };
foreach (var d in directories) foreach (var d in directories)
Directory.CreateDirectory(d); Directory.CreateDirectory(d);
} }
private static string path; private static string path;
private Because of = () => path = FolderSearch.FindFolder(AppDomain.CurrentDomain.BaseDirectory, "*"); private Because of = () => path = FolderSearch.FindFolder(AppDomain.CurrentDomain.BaseDirectory, "*");
private It should_return_the_one_that_matches_our_own_assembly_version = private It should_return_the_one_that_matches_our_own_assembly_version =
() => path.Should().Be(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, getAssemblyVersion())); () => path.Should().Be(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, getAssemblyVersion()));
} }
public class FolderSearchSpec public class FolderSearchSpec
{ {
public static string BaseDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); public static string BaseDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
public static string MongoBinaries = Path.Combine(BaseDir, "test1", "test2", "packages", "Mongo2Go.1.2.3", "tools", "mongodb-win32-i386-2.0.7-rc0", "bin"); public static string MongoBinaries = Path.Combine(BaseDir, "test1", "test2", "packages", "Mongo2Go.1.2.3", "tools", "mongodb-win32-i386-2.0.7-rc0", "bin");
public static string MongoOlderBinaries = Path.Combine(BaseDir, "test1", "test2", "packages", "Mongo2Go.1.1.1", "tools", "mongodb-win32-i386-2.0.7-rc0", "bin"); public static string MongoOlderBinaries = Path.Combine(BaseDir, "test1", "test2", "packages", "Mongo2Go.1.1.1", "tools", "mongodb-win32-i386-2.0.7-rc0", "bin");
public static string LocationOfAssembly = Path.Combine(BaseDir, "test1", "test2", "Project", "bin"); public static string LocationOfAssembly = Path.Combine(BaseDir, "test1", "test2", "Project", "bin");
Establish context = () => Establish context = () =>
{ {
if (!Directory.Exists(BaseDir)) { Directory.CreateDirectory(BaseDir); } if (!Directory.Exists(BaseDir)) { Directory.CreateDirectory(BaseDir); }
if (!Directory.Exists(MongoBinaries)) { Directory.CreateDirectory(MongoBinaries); } if (!Directory.Exists(MongoBinaries)) { Directory.CreateDirectory(MongoBinaries); }
if (!Directory.Exists(MongoOlderBinaries)) { Directory.CreateDirectory(MongoOlderBinaries); } if (!Directory.Exists(MongoOlderBinaries)) { Directory.CreateDirectory(MongoOlderBinaries); }
if (!Directory.Exists(LocationOfAssembly)) { Directory.CreateDirectory(LocationOfAssembly); } if (!Directory.Exists(LocationOfAssembly)) { Directory.CreateDirectory(LocationOfAssembly); }
}; };
Cleanup stuff = () => { if (Directory.Exists(BaseDir)) { Directory.Delete(BaseDir, true); }}; Cleanup stuff = () => { if (Directory.Exists(BaseDir)) { Directory.Delete(BaseDir, true); }};
} }
} }
// ReSharper restore UnusedMember.Local // ReSharper restore UnusedMember.Local
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming

View File

@@ -1,21 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Mongo2Go\Mongo2Go.csproj" /> <ProjectReference Include="..\Mongo2Go\Mongo2Go.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.10.3" /> <PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Machine.Specifications" Version="1.0.0" /> <PackageReference Include="Machine.Specifications" Version="1.0.0" />
<PackageReference Include="Machine.Specifications.Runner.VisualStudio" Version="2.10.1" /> <PackageReference Include="Machine.Specifications.Runner.VisualStudio" Version="2.10.1" />
<PackageReference Include="MELT" Version="0.7.0" /> <PackageReference Include="MELT" Version="0.7.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.1" />
<PackageReference Include="Moq" Version="4.16.1" /> <PackageReference Include="Moq" Version="4.16.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.Net.Http" Version="4.3.4" /> <PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" /> <PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,76 +1,76 @@
using FluentAssertions; using FluentAssertions;
using Machine.Specifications; using Machine.Specifications;
using Mongo2Go.Helper; using Mongo2Go.Helper;
using System; using System;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable UnusedMember.Local // ReSharper disable UnusedMember.Local
namespace Mongo2GoTests namespace Mongo2GoTests
{ {
[Subject(typeof(MongodArguments))] [Subject(typeof(MongodArguments))]
public class when_null_additional_arguments_return_empty_string public class when_null_additional_arguments_return_empty_string
{ {
private static string validAdditionalArguments; private static string validAdditionalArguments;
Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, null); Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, null);
It should_be_empty_string = () => validAdditionalArguments.Should().BeEmpty(); It should_be_empty_string = () => validAdditionalArguments.Should().BeEmpty();
} }
[Subject(typeof(MongodArguments))] [Subject(typeof(MongodArguments))]
public class when_no_additional_arguments_return_empty_string public class when_no_additional_arguments_return_empty_string
{ {
private static string validAdditionalArguments; private static string validAdditionalArguments;
Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, string.Empty); Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, string.Empty);
It should_be_empty_string = () => validAdditionalArguments.Should().BeEmpty(); It should_be_empty_string = () => validAdditionalArguments.Should().BeEmpty();
} }
[Subject(typeof(MongodArguments))] [Subject(typeof(MongodArguments))]
public class when_additional_arguments_start_with_argument_separator_return_additional_arguments public class when_additional_arguments_start_with_argument_separator_return_additional_arguments
{ {
private static string validAdditionalArguments; private static string validAdditionalArguments;
private const string additionalArgumentsUnderTest = " --argument_1 under_test --argument_2 under test"; private const string additionalArgumentsUnderTest = " --argument_1 under_test --argument_2 under test";
private const string expectedAdditionalArguments = " --argument_1 under_test --argument_2 under test"; private const string expectedAdditionalArguments = " --argument_1 under_test --argument_2 under test";
Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, additionalArgumentsUnderTest); Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, additionalArgumentsUnderTest);
It should_be_expected_additional_arguments = () => validAdditionalArguments.Should().Be(expectedAdditionalArguments); It should_be_expected_additional_arguments = () => validAdditionalArguments.Should().Be(expectedAdditionalArguments);
} }
[Subject(typeof(MongodArguments))] [Subject(typeof(MongodArguments))]
public class when_additional_arguments_does_not_start_with_argument_separator_return_additional_arguments public class when_additional_arguments_does_not_start_with_argument_separator_return_additional_arguments
{ {
private static string validAdditionalArguments; private static string validAdditionalArguments;
private const string additionalArgumentsUnderTest = "argument_1 under_test --argument_2 under test"; private const string additionalArgumentsUnderTest = "argument_1 under_test --argument_2 under test";
private const string expectedAdditionalArguments = " --argument_1 under_test --argument_2 under test"; private const string expectedAdditionalArguments = " --argument_1 under_test --argument_2 under test";
Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, additionalArgumentsUnderTest); Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(string.Empty, additionalArgumentsUnderTest);
It should_be_expected_additional_arguments = () => validAdditionalArguments.Should().Be(expectedAdditionalArguments); It should_be_expected_additional_arguments = () => validAdditionalArguments.Should().Be(expectedAdditionalArguments);
} }
[Subject(typeof(MongodArguments))] [Subject(typeof(MongodArguments))]
public class when_existing_arguments_and_additional_arguments_do_not_have_shared_options_return_additional_arguments public class when_existing_arguments_and_additional_arguments_do_not_have_shared_options_return_additional_arguments
{ {
private static string validAdditionalArguments; private static string validAdditionalArguments;
private const string existingArguments = "--existing_argument1 --existing_argument2"; private const string existingArguments = "--existing_argument1 --existing_argument2";
private const string additionalArgumentsUnderTest = " --argument_1 under_test --argument_2 under test"; private const string additionalArgumentsUnderTest = " --argument_1 under_test --argument_2 under test";
private const string expectedAdditionalArguments = " --argument_1 under_test --argument_2 under test"; private const string expectedAdditionalArguments = " --argument_1 under_test --argument_2 under test";
Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(existingArguments, additionalArgumentsUnderTest); Because of = () => validAdditionalArguments = MongodArguments.GetValidAdditionalArguments(existingArguments, additionalArgumentsUnderTest);
It should_be_expected_additional_arguments = () => validAdditionalArguments.Should().Be(expectedAdditionalArguments); It should_be_expected_additional_arguments = () => validAdditionalArguments.Should().Be(expectedAdditionalArguments);
} }
[Subject(typeof(MongodArguments))] [Subject(typeof(MongodArguments))]
public class when_existing_arguments_and_additional_arguments_have_shared_options_throw_argument_exception public class when_existing_arguments_and_additional_arguments_have_shared_options_throw_argument_exception
{ {
private static Exception exception; private static Exception exception;
private const string duplicateArgument = "existing_argument2"; private const string duplicateArgument = "existing_argument2";
private static readonly string existingArguments = $"--existing_argument1 --{duplicateArgument}"; private static readonly string existingArguments = $"--existing_argument1 --{duplicateArgument}";
private static readonly string additionalArgumentsUnderTest = $" --argument_1 under_test --{duplicateArgument} argument2_new_value --argument_2 under test"; private static readonly string additionalArgumentsUnderTest = $" --argument_1 under_test --{duplicateArgument} argument2_new_value --argument_2 under test";
Because of = () => exception = Catch.Exception(() => MongodArguments.GetValidAdditionalArguments(existingArguments, additionalArgumentsUnderTest)); Because of = () => exception = Catch.Exception(() => MongodArguments.GetValidAdditionalArguments(existingArguments, additionalArgumentsUnderTest));
It should_throw_argument_exception = () => exception.Should().BeOfType<ArgumentException>(); It should_throw_argument_exception = () => exception.Should().BeOfType<ArgumentException>();
It should_contain_more_than_instance_of_the_duplicate_argument = () => exception.Message.IndexOf(duplicateArgument, StringComparison.InvariantCultureIgnoreCase).Should().NotBe(exception.Message.LastIndexOf(duplicateArgument, StringComparison.InvariantCultureIgnoreCase)); It should_contain_more_than_instance_of_the_duplicate_argument = () => exception.Message.IndexOf(duplicateArgument, StringComparison.InvariantCultureIgnoreCase).Should().NotBe(exception.Message.LastIndexOf(duplicateArgument, StringComparison.InvariantCultureIgnoreCase));
} }
} }
// ReSharper restore UnusedMember.Local // ReSharper restore UnusedMember.Local
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming

View File

@@ -1,34 +1,34 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Mongo2Go; using Mongo2Go;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Driver; using MongoDB.Driver;
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
public class MongoDebuggingTest public class MongoDebuggingTest
{ {
internal static MongoDbRunner _runner; internal static MongoDbRunner _runner;
internal static IMongoCollection<TestDocument> _collection; internal static IMongoCollection<TestDocument> _collection;
internal static string _databaseName = "IntegrationTest"; internal static string _databaseName = "IntegrationTest";
internal static string _collectionName = "TestCollection"; internal static string _collectionName = "TestCollection";
internal static IMongoDatabase _database; internal static IMongoDatabase _database;
internal static void CreateConnection() internal static void CreateConnection()
{ {
_runner = MongoDbRunner.StartForDebugging(singleNodeReplSet: false); _runner = MongoDbRunner.StartForDebugging(singleNodeReplSet: false);
MongoClient client = new MongoClient(_runner.ConnectionString); MongoClient client = new MongoClient(_runner.ConnectionString);
_database = client.GetDatabase(_databaseName); _database = client.GetDatabase(_databaseName);
_collection = _database.GetCollection<TestDocument>(_collectionName); _collection = _database.GetCollection<TestDocument>(_collectionName);
} }
public static IList<T> ReadBsonFile<T>(string fileName) public static IList<T> ReadBsonFile<T>(string fileName)
{ {
string[] content = File.ReadAllLines(fileName); string[] content = File.ReadAllLines(fileName);
return content.Select(s => BsonSerializer.Deserialize<T>(s)).ToList(); return content.Select(s => BsonSerializer.Deserialize<T>(s)).ToList();
} }
} }
} }

View File

@@ -1,47 +1,47 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Mongo2Go; using Mongo2Go;
using MongoDB.Driver; using MongoDB.Driver;
using System; using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
public class MongoIntegrationTest public class MongoIntegrationTest
{ {
internal static MongoDbRunner _runner; internal static MongoDbRunner _runner;
internal static IMongoCollection<TestDocument> _collection; internal static IMongoCollection<TestDocument> _collection;
internal static string _databaseName = "IntegrationTest"; internal static string _databaseName = "IntegrationTest";
internal static string _collectionName = "TestCollection"; internal static string _collectionName = "TestCollection";
internal static void CreateConnection(ILogger logger = null) internal static void CreateConnection(ILogger logger = null)
{ {
_runner = MongoDbRunner.Start(singleNodeReplSet: false, logger: logger); _runner = MongoDbRunner.Start(singleNodeReplSet: false, logger: logger);
MongoClient client = new MongoClient(_runner.ConnectionString); MongoClient client = new MongoClient(_runner.ConnectionString);
IMongoDatabase database = client.GetDatabase(_databaseName); IMongoDatabase database = client.GetDatabase(_databaseName);
_collection = database.GetCollection<TestDocument>(_collectionName); _collection = database.GetCollection<TestDocument>(_collectionName);
} }
} }
public static class TaskExtensions public static class TaskExtensions
{ {
public static async Task WithTimeout(this Task task, TimeSpan timeout) public static async Task WithTimeout(this Task task, TimeSpan timeout)
{ {
using (var cancellationTokenSource = new CancellationTokenSource()) using (var cancellationTokenSource = new CancellationTokenSource())
{ {
var completedTask = await Task.WhenAny(task, Task.Delay(timeout, cancellationTokenSource.Token)); var completedTask = await Task.WhenAny(task, Task.Delay(timeout, cancellationTokenSource.Token));
if (completedTask == task) if (completedTask == task)
{ {
cancellationTokenSource.Cancel(); cancellationTokenSource.Cancel();
await task; await task;
} }
else else
{ {
throw new TimeoutException("The operation has timed out."); throw new TimeoutException("The operation has timed out.");
} }
} }
} }
} }
} }

View File

@@ -1,36 +1,36 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Mongo2Go; using Mongo2Go;
using MongoDB.Driver; using MongoDB.Driver;
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
public class MongoTransactionTest public class MongoTransactionTest
{ {
internal static MongoDbRunner _runner; internal static MongoDbRunner _runner;
internal static IMongoCollection<TestDocument> _mainCollection; internal static IMongoCollection<TestDocument> _mainCollection;
internal static IMongoCollection<TestDocument> _dependentCollection; internal static IMongoCollection<TestDocument> _dependentCollection;
internal static string _databaseName = "TransactionTest"; internal static string _databaseName = "TransactionTest";
internal static string _mainCollectionName = "MainCollection"; internal static string _mainCollectionName = "MainCollection";
internal static string _dependentCollectionName = "DependentCollection"; internal static string _dependentCollectionName = "DependentCollection";
internal static IMongoDatabase database; internal static IMongoDatabase database;
internal static IMongoClient client; internal static IMongoClient client;
internal static void CreateConnection(ushort? singleNodeReplSetWaitTimeout = null) internal static void CreateConnection(ushort? singleNodeReplSetWaitTimeout = null)
{ {
if (singleNodeReplSetWaitTimeout.HasValue) if (singleNodeReplSetWaitTimeout.HasValue)
{ {
_runner = MongoDbRunner.Start(singleNodeReplSet: true, singleNodeReplSetWaitTimeout: singleNodeReplSetWaitTimeout.Value); _runner = MongoDbRunner.Start(singleNodeReplSet: true, singleNodeReplSetWaitTimeout: singleNodeReplSetWaitTimeout.Value);
} }
else else
{ {
_runner = MongoDbRunner.Start(singleNodeReplSet: true); _runner = MongoDbRunner.Start(singleNodeReplSet: true);
} }
client = new MongoClient(_runner.ConnectionString); client = new MongoClient(_runner.ConnectionString);
database = client.GetDatabase(_databaseName); database = client.GetDatabase(_databaseName);
_mainCollection = database.GetCollection<TestDocument>(_mainCollectionName); _mainCollection = database.GetCollection<TestDocument>(_mainCollectionName);
_dependentCollection = database.GetCollection<TestDocument>(_dependentCollectionName); _dependentCollection = database.GetCollection<TestDocument>(_dependentCollectionName);
} }
} }
} }

View File

@@ -1,89 +1,89 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using FluentAssertions; using FluentAssertions;
using Machine.Specifications; using Machine.Specifications;
using Mongo2Go.Helper; using Mongo2Go.Helper;
using MongoDB.Driver; using MongoDB.Driver;
using MongoDB.Driver.Linq; using MongoDB.Driver.Linq;
using It = Machine.Specifications.It; using It = Machine.Specifications.It;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable UnusedMember.Local // ReSharper disable UnusedMember.Local
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
[Subject("Runner Integration Test")] [Subject("Runner Integration Test")]
public class when_using_monogoexport : MongoDebuggingTest public class when_using_monogoexport : MongoDebuggingTest
{ {
static readonly string _testFile = Path.GetTempPath() + "testExport.json"; static readonly string _testFile = Path.GetTempPath() + "testExport.json";
static IList<TestDocument> parsedContent; static IList<TestDocument> parsedContent;
Establish context = () => Establish context = () =>
{ {
CreateConnection(); CreateConnection();
_database.DropCollection(_collectionName); _database.DropCollection(_collectionName);
_collection.InsertOne(TestDocument.DummyData1()); _collection.InsertOne(TestDocument.DummyData1());
_collection.InsertOne(TestDocument.DummyData2()); _collection.InsertOne(TestDocument.DummyData2());
_collection.InsertOne(TestDocument.DummyData3()); _collection.InsertOne(TestDocument.DummyData3());
}; };
Because of = () => Because of = () =>
{ {
_runner.Export(_databaseName, _collectionName, _testFile); _runner.Export(_databaseName, _collectionName, _testFile);
Thread.Sleep(500); Thread.Sleep(500);
parsedContent = ReadBsonFile<TestDocument>(_testFile); parsedContent = ReadBsonFile<TestDocument>(_testFile);
}; };
It should_preserve_all_values1 = () => parsedContent[0].Should().BeEquivalentTo(TestDocument.DummyData1(), cfg => cfg.Excluding(d => d.Id)); It should_preserve_all_values1 = () => parsedContent[0].Should().BeEquivalentTo(TestDocument.DummyData1(), cfg => cfg.Excluding(d => d.Id));
It should_preserve_all_values2 = () => parsedContent[1].Should().BeEquivalentTo(TestDocument.DummyData2(), cfg => cfg.Excluding(d => d.Id)); It should_preserve_all_values2 = () => parsedContent[1].Should().BeEquivalentTo(TestDocument.DummyData2(), cfg => cfg.Excluding(d => d.Id));
It should_preserve_all_values3 = () => parsedContent[2].Should().BeEquivalentTo(TestDocument.DummyData3(), cfg => cfg.Excluding(d => d.Id)); It should_preserve_all_values3 = () => parsedContent[2].Should().BeEquivalentTo(TestDocument.DummyData3(), cfg => cfg.Excluding(d => d.Id));
Cleanup stuff = () => Cleanup stuff = () =>
{ {
new FileSystem().DeleteFile(_testFile); new FileSystem().DeleteFile(_testFile);
_runner.Dispose(); _runner.Dispose();
}; };
} }
[Subject("Runner Integration Test")] [Subject("Runner Integration Test")]
public class when_using_monogoimport : MongoDebuggingTest public class when_using_monogoimport : MongoDebuggingTest
{ {
static IQueryable<TestDocument> query; static IQueryable<TestDocument> query;
static readonly string _testFile = Path.GetTempPath() + "testImport.json"; static readonly string _testFile = Path.GetTempPath() + "testImport.json";
const string _filecontent = const string _filecontent =
@"{ ""_id"" : { ""$oid"" : ""50227b375dff9218248eadc4"" }, ""StringTest"" : ""Hello World"", ""IntTest"" : 42, ""DateTest"" : { ""$date"" : ""1984-09-30T06:06:06.171Z"" }, ""ListTest"" : [ ""I"", ""am"", ""a"", ""list"", ""of"", ""strings"" ] }" + "\r\n" + @"{ ""_id"" : { ""$oid"" : ""50227b375dff9218248eadc4"" }, ""StringTest"" : ""Hello World"", ""IntTest"" : 42, ""DateTest"" : { ""$date"" : ""1984-09-30T06:06:06.171Z"" }, ""ListTest"" : [ ""I"", ""am"", ""a"", ""list"", ""of"", ""strings"" ] }" + "\r\n" +
@"{ ""_id"" : { ""$oid"" : ""50227b375dff9218248eadc5"" }, ""StringTest"" : ""Foo"", ""IntTest"" : 23, ""DateTest"" : null, ""ListTest"" : null }" + "\r\n" + @"{ ""_id"" : { ""$oid"" : ""50227b375dff9218248eadc5"" }, ""StringTest"" : ""Foo"", ""IntTest"" : 23, ""DateTest"" : null, ""ListTest"" : null }" + "\r\n" +
@"{ ""_id"" : { ""$oid"" : ""50227b375dff9218248eadc6"" }, ""StringTest"" : ""Bar"", ""IntTest"" : 77, ""DateTest"" : null, ""ListTest"" : null }" + "\r\n"; @"{ ""_id"" : { ""$oid"" : ""50227b375dff9218248eadc6"" }, ""StringTest"" : ""Bar"", ""IntTest"" : 77, ""DateTest"" : null, ""ListTest"" : null }" + "\r\n";
Establish context = () => Establish context = () =>
{ {
CreateConnection(); CreateConnection();
_database.DropCollection(_collectionName); _database.DropCollection(_collectionName);
File.WriteAllText(_testFile, _filecontent); File.WriteAllText(_testFile, _filecontent);
}; };
Because of = () => Because of = () =>
{ {
_runner.Import(_databaseName, _collectionName, _testFile, true); _runner.Import(_databaseName, _collectionName, _testFile, true);
Thread.Sleep(500); Thread.Sleep(500);
query = _collection.AsQueryable().Select(c => c).OrderBy(c => c.Id); ; query = _collection.AsQueryable().Select(c => c).OrderBy(c => c.Id); ;
}; };
It should_return_document1 = () => query.ToList().ElementAt(0).Should().BeEquivalentTo(TestDocument.DummyData1(), cfg => cfg.Excluding(d => d.Id)); It should_return_document1 = () => query.ToList().ElementAt(0).Should().BeEquivalentTo(TestDocument.DummyData1(), cfg => cfg.Excluding(d => d.Id));
It should_return_document2 = () => query.ToList().ElementAt(1).Should().BeEquivalentTo(TestDocument.DummyData2(), cfg => cfg.Excluding(d => d.Id)); It should_return_document2 = () => query.ToList().ElementAt(1).Should().BeEquivalentTo(TestDocument.DummyData2(), cfg => cfg.Excluding(d => d.Id));
It should_return_document3 = () => query.ToList().ElementAt(2).Should().BeEquivalentTo(TestDocument.DummyData3(), cfg => cfg.Excluding(d => d.Id)); It should_return_document3 = () => query.ToList().ElementAt(2).Should().BeEquivalentTo(TestDocument.DummyData3(), cfg => cfg.Excluding(d => d.Id));
Cleanup stuff = () => Cleanup stuff = () =>
{ {
new FileSystem().DeleteFile(_testFile); new FileSystem().DeleteFile(_testFile);
_runner.Dispose(); _runner.Dispose();
}; };
} }
} }
// ReSharper restore UnusedMember.Local // ReSharper restore UnusedMember.Local
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming

View File

@@ -1,118 +1,118 @@
using FluentAssertions; using FluentAssertions;
using Machine.Specifications; using Machine.Specifications;
using MELT; using MELT;
using MongoDB.Driver; using MongoDB.Driver;
using MongoDB.Driver.Linq; using MongoDB.Driver.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using It = Machine.Specifications.It; using It = Machine.Specifications.It;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable UnusedMember.Local // ReSharper disable UnusedMember.Local
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
[Subject("Runner Integration Test")] [Subject("Runner Integration Test")]
public class when_using_the_inbuild_serialization : MongoIntegrationTest public class when_using_the_inbuild_serialization : MongoIntegrationTest
{ {
static TestDocument findResult; static TestDocument findResult;
Establish context = () => Establish context = () =>
{ {
CreateConnection(); CreateConnection();
_collection.InsertOne(TestDocument.DummyData1()); _collection.InsertOne(TestDocument.DummyData1());
}; };
Because of = () => findResult = _collection.FindSync<TestDocument>(_ => true).First(); Because of = () => findResult = _collection.FindSync<TestDocument>(_ => true).First();
It should_return_a_result = () => findResult.Should().NotBeNull(); It should_return_a_result = () => findResult.Should().NotBeNull();
It should_hava_expected_data = () => findResult.Should().BeEquivalentTo(TestDocument.DummyData1(), cfg => cfg.Excluding(d => d.Id)); It should_hava_expected_data = () => findResult.Should().BeEquivalentTo(TestDocument.DummyData1(), cfg => cfg.Excluding(d => d.Id));
Cleanup stuff = () => _runner.Dispose(); Cleanup stuff = () => _runner.Dispose();
} }
[Subject("Runner Integration Test")] [Subject("Runner Integration Test")]
public class when_using_the_new_linq_support : MongoIntegrationTest public class when_using_the_new_linq_support : MongoIntegrationTest
{ {
static List<TestDocument> queryResult; static List<TestDocument> queryResult;
Establish context = () => Establish context = () =>
{ {
CreateConnection(); CreateConnection();
_collection.InsertOne(TestDocument.DummyData1()); _collection.InsertOne(TestDocument.DummyData1());
_collection.InsertOne(TestDocument.DummyData2()); _collection.InsertOne(TestDocument.DummyData2());
_collection.InsertOne(TestDocument.DummyData3()); _collection.InsertOne(TestDocument.DummyData3());
}; };
Because of = () => Because of = () =>
{ {
queryResult = (from c in _collection.AsQueryable() queryResult = (from c in _collection.AsQueryable()
where c.StringTest == TestDocument.DummyData2().StringTest || c.StringTest == TestDocument.DummyData3().StringTest where c.StringTest == TestDocument.DummyData2().StringTest || c.StringTest == TestDocument.DummyData3().StringTest
select c).ToList(); select c).ToList();
}; };
It should_return_two_documents = () => queryResult.Count().Should().Be(2); It should_return_two_documents = () => queryResult.Count().Should().Be(2);
It should_return_document2 = () => queryResult.ElementAt(0).IntTest = TestDocument.DummyData2().IntTest; It should_return_document2 = () => queryResult.ElementAt(0).IntTest = TestDocument.DummyData2().IntTest;
It should_return_document3 = () => queryResult.ElementAt(1).IntTest = TestDocument.DummyData3().IntTest; It should_return_document3 = () => queryResult.ElementAt(1).IntTest = TestDocument.DummyData3().IntTest;
Cleanup stuff = () => _runner.Dispose(); Cleanup stuff = () => _runner.Dispose();
} }
[Subject("Runner Integration Test")] [Subject("Runner Integration Test")]
public class when_using_commands_that_create_console_output : MongoIntegrationTest public class when_using_commands_that_create_console_output : MongoIntegrationTest
{ {
static List<Task> taskList = new List<Task>(); static List<Task> taskList = new List<Task>();
private Establish context = () => private Establish context = () =>
{ {
CreateConnection(); CreateConnection();
}; };
private Because of = () => private Because of = () =>
{ {
var createIndexModel = new CreateIndexModel<TestDocument>(Builders<TestDocument>.IndexKeys.Ascending(x => x.IntTest)); var createIndexModel = new CreateIndexModel<TestDocument>(Builders<TestDocument>.IndexKeys.Ascending(x => x.IntTest));
taskList.Add(_collection.Indexes.CreateOneAsync(createIndexModel).WithTimeout(TimeSpan.FromMilliseconds(5000))); taskList.Add(_collection.Indexes.CreateOneAsync(createIndexModel).WithTimeout(TimeSpan.FromMilliseconds(5000)));
taskList.Add(_collection.Indexes.DropAllAsync().WithTimeout(TimeSpan.FromMilliseconds(5000))); taskList.Add(_collection.Indexes.DropAllAsync().WithTimeout(TimeSpan.FromMilliseconds(5000)));
}; };
It should_not_timeout = () => Task.WaitAll(taskList.ToArray()); It should_not_timeout = () => Task.WaitAll(taskList.ToArray());
Cleanup stuff = () => _runner.Dispose(); Cleanup stuff = () => _runner.Dispose();
} }
[Subject("Runner Integration Test")] [Subject("Runner Integration Test")]
public class when_using_microsoft_ilogger : MongoIntegrationTest public class when_using_microsoft_ilogger : MongoIntegrationTest
{ {
static List<Task> taskList = new List<Task>(); static List<Task> taskList = new List<Task>();
static ITestLoggerFactory loggerFactory; static ITestLoggerFactory loggerFactory;
private Establish context = () => private Establish context = () =>
{ {
loggerFactory = TestLoggerFactory.Create(); loggerFactory = TestLoggerFactory.Create();
var logger = loggerFactory.CreateLogger("MyTestLogger"); var logger = loggerFactory.CreateLogger("MyTestLogger");
CreateConnection(logger); CreateConnection(logger);
}; };
private Because of = () => private Because of = () =>
{ {
var createIndexModel = new CreateIndexModel<TestDocument>(Builders<TestDocument>.IndexKeys.Ascending(x => x.IntTest)); var createIndexModel = new CreateIndexModel<TestDocument>(Builders<TestDocument>.IndexKeys.Ascending(x => x.IntTest));
taskList.Add(_collection.Indexes.CreateOneAsync(createIndexModel).WithTimeout(TimeSpan.FromMilliseconds(5000))); taskList.Add(_collection.Indexes.CreateOneAsync(createIndexModel).WithTimeout(TimeSpan.FromMilliseconds(5000)));
taskList.Add(_collection.Indexes.DropAllAsync().WithTimeout(TimeSpan.FromMilliseconds(5000))); taskList.Add(_collection.Indexes.DropAllAsync().WithTimeout(TimeSpan.FromMilliseconds(5000)));
}; };
It should_not_timeout = () => Task.WaitAll(taskList.ToArray()); It should_not_timeout = () => Task.WaitAll(taskList.ToArray());
It should_have_received_many_logs = () => It should_have_received_many_logs = () =>
loggerFactory.Sink.LogEntries.Count(l => l.LogLevel == Microsoft.Extensions.Logging.LogLevel.Information) loggerFactory.Sink.LogEntries.Count(l => l.LogLevel == Microsoft.Extensions.Logging.LogLevel.Information)
.Should().BeGreaterThan(10); .Should().BeGreaterThan(10);
It should_have_created_collection_statement = () => loggerFactory.Sink.LogEntries It should_have_created_collection_statement = () => loggerFactory.Sink.LogEntries
.Count(l => l.Properties.Any(p => p.Key == "message" && (string)p.Value == "createCollection")) .Count(l => l.Properties.Any(p => p.Key == "message" && (string)p.Value == "createCollection"))
.Should().BeGreaterOrEqualTo(1); .Should().BeGreaterOrEqualTo(1);
Cleanup stuff = () => _runner.Dispose(); Cleanup stuff = () => _runner.Dispose();
} }
} }
// ReSharper restore UnusedMember.Local // ReSharper restore UnusedMember.Local
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming

View File

@@ -1,108 +1,108 @@
using FluentAssertions; using FluentAssertions;
using Machine.Specifications; using Machine.Specifications;
using Mongo2Go; using Mongo2Go;
using Mongo2Go.Helper; using Mongo2Go.Helper;
using Moq; using Moq;
using System.IO; using System.IO;
using It = Machine.Specifications.It; using It = Machine.Specifications.It;
#pragma warning disable CS0618 // Type or member is obsolete #pragma warning disable CS0618 // Type or member is obsolete
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable UnusedMember.Local // ReSharper disable UnusedMember.Local
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
[Subject("Runner")] [Subject("Runner")]
public class when_instantiating_the_runner_for_integration_test public class when_instantiating_the_runner_for_integration_test
{ {
static MongoDbRunner runner; static MongoDbRunner runner;
static Mock<IPortPool> portPoolMock; static Mock<IPortPool> portPoolMock;
static Mock<IFileSystem> fileSystemMock; static Mock<IFileSystem> fileSystemMock;
static Mock<IMongoDbProcessStarter> processStarterMock; static Mock<IMongoDbProcessStarter> processStarterMock;
static Mock<IMongoBinaryLocator> binaryLocatorMock; static Mock<IMongoBinaryLocator> binaryLocatorMock;
static string exptectedDataDirectory; static string exptectedDataDirectory;
static string exptectedLogfile; static string exptectedLogfile;
static readonly string exptectedConnectString = "mongodb://127.0.0.1:{0}/".Formatted(MongoDbDefaults.TestStartPort + 1); static readonly string exptectedConnectString = "mongodb://127.0.0.1:{0}/".Formatted(MongoDbDefaults.TestStartPort + 1);
Establish context = () => Establish context = () =>
{ {
portPoolMock = new Mock<IPortPool>(); portPoolMock = new Mock<IPortPool>();
portPoolMock.Setup(m => m.GetNextOpenPort()).Returns(MongoDbDefaults.TestStartPort + 1); portPoolMock.Setup(m => m.GetNextOpenPort()).Returns(MongoDbDefaults.TestStartPort + 1);
fileSystemMock = new Mock<IFileSystem>(); fileSystemMock = new Mock<IFileSystem>();
fileSystemMock.Setup(m => m.CreateFolder(Moq.It.IsAny<string>())).Callback<string>(s => fileSystemMock.Setup(m => m.CreateFolder(Moq.It.IsAny<string>())).Callback<string>(s =>
{ {
exptectedDataDirectory = s; exptectedDataDirectory = s;
exptectedLogfile = Path.Combine(exptectedDataDirectory, MongoDbDefaults.Lockfile); exptectedLogfile = Path.Combine(exptectedDataDirectory, MongoDbDefaults.Lockfile);
}); });
var processMock = new Mock<IMongoDbProcess>(); var processMock = new Mock<IMongoDbProcess>();
processStarterMock = new Mock<IMongoDbProcessStarter>(); processStarterMock = new Mock<IMongoDbProcessStarter>();
processStarterMock.Setup(m => m.Start(Moq.It.IsAny<string>(), Moq.It.IsAny<string>(), Moq.It.IsAny<int>(), false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null)).Returns(processMock.Object); processStarterMock.Setup(m => m.Start(Moq.It.IsAny<string>(), Moq.It.IsAny<string>(), Moq.It.IsAny<int>(), false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null)).Returns(processMock.Object);
binaryLocatorMock = new Mock<IMongoBinaryLocator> (); binaryLocatorMock = new Mock<IMongoBinaryLocator> ();
binaryLocatorMock.Setup(m => m.Directory).Returns(string.Empty); binaryLocatorMock.Setup(m => m.Directory).Returns(string.Empty);
}; };
Because of = () => runner = MongoDbRunner.StartUnitTest(portPoolMock.Object, fileSystemMock.Object, processStarterMock.Object, binaryLocatorMock.Object); Because of = () => runner = MongoDbRunner.StartUnitTest(portPoolMock.Object, fileSystemMock.Object, processStarterMock.Object, binaryLocatorMock.Object);
It should_create_the_data_directory = () => fileSystemMock.Verify(x => x.CreateFolder(Moq.It.Is<string>(s => s.StartsWith(Path.GetTempPath()))), Times.Exactly(1)); It should_create_the_data_directory = () => fileSystemMock.Verify(x => x.CreateFolder(Moq.It.Is<string>(s => s.StartsWith(Path.GetTempPath()))), Times.Exactly(1));
It should_delete_old_lock_file = () => fileSystemMock.Verify(x => x.DeleteFile(exptectedLogfile), Times.Exactly(1)); It should_delete_old_lock_file = () => fileSystemMock.Verify(x => x.DeleteFile(exptectedLogfile), Times.Exactly(1));
It should_start_the_process = () => processStarterMock.Verify(x => x.Start(Moq.It.IsAny<string>(), Moq.It.IsAny<string>(), Moq.It.IsAny<int>(), false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null), Times.Exactly(1)); It should_start_the_process = () => processStarterMock.Verify(x => x.Start(Moq.It.IsAny<string>(), Moq.It.IsAny<string>(), Moq.It.IsAny<int>(), false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null), Times.Exactly(1));
It should_have_expected_connection_string = () => runner.ConnectionString.Should().Be(exptectedConnectString); It should_have_expected_connection_string = () => runner.ConnectionString.Should().Be(exptectedConnectString);
It should_return_an_instance_with_state_running = () => runner.State.Should().Be(State.Running); It should_return_an_instance_with_state_running = () => runner.State.Should().Be(State.Running);
} }
[Subject("Runner")] [Subject("Runner")]
public class when_instantiating_the_runner_for_local_debugging public class when_instantiating_the_runner_for_local_debugging
{ {
static MongoDbRunner runner; static MongoDbRunner runner;
static Mock<IPortWatcher> portWatcherMock; static Mock<IPortWatcher> portWatcherMock;
static Mock<IProcessWatcher> processWatcherMock; static Mock<IProcessWatcher> processWatcherMock;
static Mock<IFileSystem> fileSystemMock; static Mock<IFileSystem> fileSystemMock;
static Mock<IMongoDbProcessStarter> processStarterMock; static Mock<IMongoDbProcessStarter> processStarterMock;
static Mock<IMongoBinaryLocator> binaryLocatorMock; static Mock<IMongoBinaryLocator> binaryLocatorMock;
static string exptectedDataDirectory; static string exptectedDataDirectory;
static string exptectedLogfile; static string exptectedLogfile;
Establish context = () => Establish context = () =>
{ {
processWatcherMock = new Mock<IProcessWatcher>(); processWatcherMock = new Mock<IProcessWatcher>();
processWatcherMock.Setup(m => m.IsProcessRunning(Moq.It.IsAny<string>())).Returns(false); processWatcherMock.Setup(m => m.IsProcessRunning(Moq.It.IsAny<string>())).Returns(false);
portWatcherMock = new Mock<IPortWatcher>(); portWatcherMock = new Mock<IPortWatcher>();
portWatcherMock.Setup(m => m.IsPortAvailable(Moq.It.IsAny<int>())).Returns(true); portWatcherMock.Setup(m => m.IsPortAvailable(Moq.It.IsAny<int>())).Returns(true);
fileSystemMock = new Mock<IFileSystem>(); fileSystemMock = new Mock<IFileSystem>();
fileSystemMock.Setup(m => m.CreateFolder(Moq.It.IsAny<string>())).Callback<string>(s => fileSystemMock.Setup(m => m.CreateFolder(Moq.It.IsAny<string>())).Callback<string>(s =>
{ {
exptectedDataDirectory = s; exptectedDataDirectory = s;
exptectedLogfile = Path.Combine(exptectedDataDirectory, MongoDbDefaults.Lockfile); exptectedLogfile = Path.Combine(exptectedDataDirectory, MongoDbDefaults.Lockfile);
}); });
var processMock = new Mock<IMongoDbProcess>(); var processMock = new Mock<IMongoDbProcess>();
processStarterMock = new Mock<IMongoDbProcessStarter>(); processStarterMock = new Mock<IMongoDbProcessStarter>();
processStarterMock.Setup(m => m.Start(Moq.It.IsAny<string>(), exptectedDataDirectory, MongoDbDefaults.DefaultPort, true, false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null)).Returns(processMock.Object); processStarterMock.Setup(m => m.Start(Moq.It.IsAny<string>(), exptectedDataDirectory, MongoDbDefaults.DefaultPort, true, false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null)).Returns(processMock.Object);
binaryLocatorMock = new Mock<IMongoBinaryLocator> (); binaryLocatorMock = new Mock<IMongoBinaryLocator> ();
binaryLocatorMock.Setup(m => m.Directory).Returns(string.Empty); binaryLocatorMock.Setup(m => m.Directory).Returns(string.Empty);
}; };
Because of = () => runner = MongoDbRunner.StartForDebuggingUnitTest(processWatcherMock.Object, portWatcherMock.Object, fileSystemMock.Object, processStarterMock.Object, binaryLocatorMock.Object); Because of = () => runner = MongoDbRunner.StartForDebuggingUnitTest(processWatcherMock.Object, portWatcherMock.Object, fileSystemMock.Object, processStarterMock.Object, binaryLocatorMock.Object);
It should_check_for_already_running_process = () => processWatcherMock.Verify(x => x.IsProcessRunning(MongoDbDefaults.ProcessName), Times.Exactly(1)); It should_check_for_already_running_process = () => processWatcherMock.Verify(x => x.IsProcessRunning(MongoDbDefaults.ProcessName), Times.Exactly(1));
It should_check_the_default_port = () => portWatcherMock.Verify(x => x.IsPortAvailable(MongoDbDefaults.DefaultPort), Times.Exactly(1)); It should_check_the_default_port = () => portWatcherMock.Verify(x => x.IsPortAvailable(MongoDbDefaults.DefaultPort), Times.Exactly(1));
It should_create_the_data_directory = () => fileSystemMock.Verify(x => x.CreateFolder(Moq.It.Is<string>(s => s.StartsWith(Path.GetTempPath()))), Times.Exactly(1)); It should_create_the_data_directory = () => fileSystemMock.Verify(x => x.CreateFolder(Moq.It.Is<string>(s => s.StartsWith(Path.GetTempPath()))), Times.Exactly(1));
It should_delete_old_lock_file = () => fileSystemMock.Verify(x => x.DeleteFile(exptectedLogfile), Times.Exactly(1)); It should_delete_old_lock_file = () => fileSystemMock.Verify(x => x.DeleteFile(exptectedLogfile), Times.Exactly(1));
It should_return_an_instance_with_state_running = () => runner.State.Should().Be(State.Running); It should_return_an_instance_with_state_running = () => runner.State.Should().Be(State.Running);
It should_start_the_process_without_kill = () => processStarterMock.Verify(x => x.Start(Moq.It.IsAny<string>(), exptectedDataDirectory, MongoDbDefaults.DefaultPort, true, false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null), Times.Exactly(1)); It should_start_the_process_without_kill = () => processStarterMock.Verify(x => x.Start(Moq.It.IsAny<string>(), exptectedDataDirectory, MongoDbDefaults.DefaultPort, true, false, Moq.It.IsAny<string>(), Moq.It.IsAny<ushort>(), null), Times.Exactly(1));
} }
} }
// ReSharper restore UnusedMember.Local // ReSharper restore UnusedMember.Local
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming

View File

@@ -1,190 +1,190 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using FluentAssertions; using FluentAssertions;
using Machine.Specifications; using Machine.Specifications;
using MongoDB.Driver; using MongoDB.Driver;
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
[Subject("Runner Transaction Test")] [Subject("Runner Transaction Test")]
public class when_transaction_completes : MongoTransactionTest public class when_transaction_completes : MongoTransactionTest
{ {
private static TestDocument mainDocument; private static TestDocument mainDocument;
private static TestDocument dependentDocument; private static TestDocument dependentDocument;
Establish context = () => Establish context = () =>
{ {
CreateConnection(); CreateConnection();
database.DropCollection(_mainCollectionName); database.DropCollection(_mainCollectionName);
database.DropCollection(_dependentCollectionName); database.DropCollection(_dependentCollectionName);
_mainCollection.InsertOne(TestDocument.DummyData2()); _mainCollection.InsertOne(TestDocument.DummyData2());
_dependentCollection.InsertOne(TestDocument.DummyData2()); _dependentCollection.InsertOne(TestDocument.DummyData2());
}; };
private Because of = () => private Because of = () =>
{ {
var filter = Builders<TestDocument>.Filter.Where(x => x.IntTest == 23); var filter = Builders<TestDocument>.Filter.Where(x => x.IntTest == 23);
var update = Builders<TestDocument>.Update.Inc(i => i.IntTest, 10); var update = Builders<TestDocument>.Update.Inc(i => i.IntTest, 10);
using (var sessionHandle = client.StartSession()) using (var sessionHandle = client.StartSession())
{ {
try try
{ {
var i = 0; var i = 0;
while (i < 10) while (i < 10)
{ {
try try
{ {
i++; i++;
sessionHandle.StartTransaction(new TransactionOptions( sessionHandle.StartTransaction(new TransactionOptions(
readConcern: ReadConcern.Local, readConcern: ReadConcern.Local,
writeConcern: WriteConcern.W1)); writeConcern: WriteConcern.W1));
try try
{ {
var first = _mainCollection.UpdateOne(sessionHandle, filter, update); var first = _mainCollection.UpdateOne(sessionHandle, filter, update);
var second = _dependentCollection.UpdateOne(sessionHandle, filter, update); var second = _dependentCollection.UpdateOne(sessionHandle, filter, update);
} }
catch (Exception) catch (Exception)
{ {
sessionHandle.AbortTransaction(); sessionHandle.AbortTransaction();
throw; throw;
} }
var j = 0; var j = 0;
while (j < 10) while (j < 10)
{ {
try try
{ {
j++; j++;
sessionHandle.CommitTransaction(); sessionHandle.CommitTransaction();
break; break;
} }
catch (MongoException e) catch (MongoException e)
{ {
if (e.HasErrorLabel("UnknownTransactionCommitResult")) if (e.HasErrorLabel("UnknownTransactionCommitResult"))
continue; continue;
throw; throw;
} }
} }
break; break;
} }
catch (MongoException e) catch (MongoException e)
{ {
if (e.HasErrorLabel("TransientTransactionError")) if (e.HasErrorLabel("TransientTransactionError"))
continue; continue;
throw; throw;
} }
} }
} }
catch (Exception) catch (Exception)
{ {
} }
} }
mainDocument = _mainCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault(); mainDocument = _mainCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault();
dependentDocument = _dependentCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault(); dependentDocument = _dependentCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault();
}; };
It main_should_be_33 = () => mainDocument.IntTest.Should().Be(33); It main_should_be_33 = () => mainDocument.IntTest.Should().Be(33);
It dependent_should_be_33 = () => dependentDocument.IntTest.Should().Be(33); It dependent_should_be_33 = () => dependentDocument.IntTest.Should().Be(33);
Cleanup cleanup = () => _runner.Dispose(); Cleanup cleanup = () => _runner.Dispose();
} }
[Subject("Runner Transaction Test")] [Subject("Runner Transaction Test")]
public class when_transaction_is_aborted_before_commit : MongoTransactionTest public class when_transaction_is_aborted_before_commit : MongoTransactionTest
{ {
private static TestDocument mainDocument; private static TestDocument mainDocument;
private static TestDocument dependentDocument; private static TestDocument dependentDocument;
private static TestDocument mainDocument_before_commit; private static TestDocument mainDocument_before_commit;
private static TestDocument dependentDocument_before_commit; private static TestDocument dependentDocument_before_commit;
Establish context = () => Establish context = () =>
{ {
CreateConnection(); CreateConnection();
database.DropCollection(_mainCollectionName); database.DropCollection(_mainCollectionName);
database.DropCollection(_dependentCollectionName); database.DropCollection(_dependentCollectionName);
_mainCollection.InsertOne(TestDocument.DummyData2()); _mainCollection.InsertOne(TestDocument.DummyData2());
_dependentCollection.InsertOne(TestDocument.DummyData2()); _dependentCollection.InsertOne(TestDocument.DummyData2());
}; };
private Because of = () => private Because of = () =>
{ {
var filter = Builders<TestDocument>.Filter.Where(x => x.IntTest == 23); var filter = Builders<TestDocument>.Filter.Where(x => x.IntTest == 23);
var update = Builders<TestDocument>.Update.Inc(i => i.IntTest, 10); var update = Builders<TestDocument>.Update.Inc(i => i.IntTest, 10);
using (var sessionHandle = client.StartSession()) using (var sessionHandle = client.StartSession())
{ {
try try
{ {
var i = 0; var i = 0;
while (i < 2) while (i < 2)
{ {
try try
{ {
i++; i++;
sessionHandle.StartTransaction(new TransactionOptions( sessionHandle.StartTransaction(new TransactionOptions(
readConcern: ReadConcern.Local, readConcern: ReadConcern.Local,
writeConcern: WriteConcern.W1)); writeConcern: WriteConcern.W1));
try try
{ {
var first = _mainCollection.UpdateOne(sessionHandle, filter, update); var first = _mainCollection.UpdateOne(sessionHandle, filter, update);
var second = _dependentCollection.UpdateOne(sessionHandle, filter, update); var second = _dependentCollection.UpdateOne(sessionHandle, filter, update);
mainDocument_before_commit = _mainCollection.FindSync(sessionHandle, Builders<TestDocument>.Filter.Empty).ToList().FirstOrDefault(); mainDocument_before_commit = _mainCollection.FindSync(sessionHandle, Builders<TestDocument>.Filter.Empty).ToList().FirstOrDefault();
dependentDocument_before_commit = _dependentCollection.FindSync(sessionHandle, Builders<TestDocument>.Filter.Empty).ToList().FirstOrDefault(); dependentDocument_before_commit = _dependentCollection.FindSync(sessionHandle, Builders<TestDocument>.Filter.Empty).ToList().FirstOrDefault();
} }
catch (Exception) catch (Exception)
{ {
sessionHandle.AbortTransaction(); sessionHandle.AbortTransaction();
throw; throw;
} }
//Throw exception and do not commit //Throw exception and do not commit
throw new ApplicationException(); throw new ApplicationException();
} }
catch (MongoException e) catch (MongoException e)
{ {
if (e.HasErrorLabel("TransientTransactionError")) if (e.HasErrorLabel("TransientTransactionError"))
continue; continue;
throw; throw;
} }
} }
} }
catch (Exception) catch (Exception)
{ {
} }
} }
mainDocument = _mainCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault(); mainDocument = _mainCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault();
dependentDocument = _dependentCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault(); dependentDocument = _dependentCollection.FindSync(Builders<TestDocument>.Filter.Empty).FirstOrDefault();
}; };
It main_should_be_still_23_after_aborting = () => mainDocument.IntTest.Should().Be(23); It main_should_be_still_23_after_aborting = () => mainDocument.IntTest.Should().Be(23);
It dependent_should_be_still_23_after_aborting = () => dependentDocument.IntTest.Should().Be(23); It dependent_should_be_still_23_after_aborting = () => dependentDocument.IntTest.Should().Be(23);
It main_should_be_33_before_aborting = () => mainDocument_before_commit.IntTest.Should().Be(33); It main_should_be_33_before_aborting = () => mainDocument_before_commit.IntTest.Should().Be(33);
It dependent_should_be_33_before_aborting = () => dependentDocument_before_commit.IntTest.Should().Be(33); It dependent_should_be_33_before_aborting = () => dependentDocument_before_commit.IntTest.Should().Be(33);
Cleanup cleanup = () => _runner.Dispose(); Cleanup cleanup = () => _runner.Dispose();
} }
[Subject("Runner Transaction Test")] [Subject("Runner Transaction Test")]
public class when_replica_set_not_ready_before_timeout_expires : MongoTransactionTest public class when_replica_set_not_ready_before_timeout_expires : MongoTransactionTest
{ {
private static Exception exception; private static Exception exception;
Because of = () => exception = Catch.Exception(() => CreateConnection(0)); Because of = () => exception = Catch.Exception(() => CreateConnection(0));
// this passes on Windows (TimeoutException as expected) // this passes on Windows (TimeoutException as expected)
// but breaks on my Mac (MongoDB.Driver.MongoCommandException: Command replSetInitiate failed: already initialized.) // but breaks on my Mac (MongoDB.Driver.MongoCommandException: Command replSetInitiate failed: already initialized.)
It should_throw_timeout_exception = () => { It should_throw_timeout_exception = () => {
Console.WriteLine(exception.ToString()); Console.WriteLine(exception.ToString());
exception.Should().BeOfType<TimeoutException>(); exception.Should().BeOfType<TimeoutException>();
}; };
} }
} }

View File

@@ -1,53 +1,53 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
namespace Mongo2GoTests.Runner namespace Mongo2GoTests.Runner
{ {
public class TestDocument public class TestDocument
{ {
[BsonId] [BsonId]
[BsonRepresentation(BsonType.ObjectId)] [BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } public string Id { get; set; }
public string StringTest { get; set; } public string StringTest { get; set; }
public int IntTest { get; set; } public int IntTest { get; set; }
[BsonDateTimeOptions(Kind = DateTimeKind.Local)] [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime? DateTest { get; set; } public DateTime? DateTest { get; set; }
public List<string> ListTest { get; set; } public List<string> ListTest { get; set; }
public static TestDocument DummyData1() public static TestDocument DummyData1()
{ {
return new TestDocument return new TestDocument
{ {
StringTest = "Hello World", StringTest = "Hello World",
IntTest = 42, IntTest = 42,
DateTest = new DateTime(1984, 09, 30, 6, 6, 6, 171, DateTimeKind.Utc).ToLocalTime(), DateTest = new DateTime(1984, 09, 30, 6, 6, 6, 171, DateTimeKind.Utc).ToLocalTime(),
ListTest = new List<string> {"I", "am", "a", "list", "of", "strings"} ListTest = new List<string> {"I", "am", "a", "list", "of", "strings"}
}; };
} }
public static TestDocument DummyData2() public static TestDocument DummyData2()
{ {
return new TestDocument return new TestDocument
{ {
StringTest = "Foo", StringTest = "Foo",
IntTest = 23, IntTest = 23,
}; };
} }
public static TestDocument DummyData3() public static TestDocument DummyData3()
{ {
return new TestDocument return new TestDocument
{ {
StringTest = "Bar", StringTest = "Bar",
IntTest = 77, IntTest = 77,
}; };
} }
} }
} }

View File

@@ -1,152 +1,152 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ByteSizeLib; using ByteSizeLib;
using Espresso3389.HttpStream; using Espresso3389.HttpStream;
using HttpProgress; using HttpProgress;
using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar; using ICSharpCode.SharpZipLib.Tar;
using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip;
namespace MongoDownloader namespace MongoDownloader
{ {
internal class ArchiveExtractor internal class ArchiveExtractor
{ {
private static readonly int CachePageSize = Convert.ToInt32(ByteSize.FromMebiBytes(4).Bytes); private static readonly int CachePageSize = Convert.ToInt32(ByteSize.FromMebiBytes(4).Bytes);
private readonly Options _options; private readonly Options _options;
private readonly BinaryStripper? _binaryStripper; private readonly BinaryStripper? _binaryStripper;
public ArchiveExtractor(Options options, BinaryStripper? binaryStripper) public ArchiveExtractor(Options options, BinaryStripper? binaryStripper)
{ {
_options = options ?? throw new ArgumentNullException(nameof(options)); _options = options ?? throw new ArgumentNullException(nameof(options));
_binaryStripper = binaryStripper; _binaryStripper = binaryStripper;
} }
public async Task<IEnumerable<Task<ByteSize>>> DownloadExtractZipArchiveAsync(Download download, DirectoryInfo extractDirectory, ArchiveProgress progress, CancellationToken cancellationToken) public async Task<IEnumerable<Task<ByteSize>>> DownloadExtractZipArchiveAsync(Download download, DirectoryInfo extractDirectory, ArchiveProgress progress, CancellationToken cancellationToken)
{ {
var bytesTransferred = 0L; var bytesTransferred = 0L;
using var headResponse = await _options.HttpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, download.Archive.Url), cancellationToken); using var headResponse = await _options.HttpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, download.Archive.Url), cancellationToken);
var contentLength = headResponse.Content.Headers.ContentLength ?? 0; var contentLength = headResponse.Content.Headers.ContentLength ?? 0;
var cacheFile = new FileInfo(Path.Combine(_options.CacheDirectory.FullName, download.Archive.Url.Segments.Last())); var cacheFile = new FileInfo(Path.Combine(_options.CacheDirectory.FullName, download.Archive.Url.Segments.Last()));
await using var cacheStream = new FileStream(cacheFile.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); await using var cacheStream = new FileStream(cacheFile.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
var stopwatch = Stopwatch.StartNew(); var stopwatch = Stopwatch.StartNew();
await using var httpStream = new HttpStream(download.Archive.Url, cacheStream, ownStream: false, CachePageSize, cached: null); await using var httpStream = new HttpStream(download.Archive.Url, cacheStream, ownStream: false, CachePageSize, cached: null);
httpStream.RangeDownloaded += (_, args) => httpStream.RangeDownloaded += (_, args) =>
{ {
bytesTransferred += args.Length; bytesTransferred += args.Length;
progress.Report(new CopyProgress(stopwatch.Elapsed, 0, bytesTransferred, contentLength)); progress.Report(new CopyProgress(stopwatch.Elapsed, 0, bytesTransferred, contentLength));
}; };
using var zipFile = new ZipFile(httpStream); using var zipFile = new ZipFile(httpStream);
var binaryRegex = _options.Binaries[(download.Product, download.Platform)]; var binaryRegex = _options.Binaries[(download.Product, download.Platform)];
var licenseRegex = _options.Licenses[(download.Product, download.Platform)]; var licenseRegex = _options.Licenses[(download.Product, download.Platform)];
var stripTasks = new List<Task<ByteSize>>(); var stripTasks = new List<Task<ByteSize>>();
foreach (var entry in zipFile.Cast<ZipEntry>().Where(e => e.IsFile)) foreach (var entry in zipFile.Cast<ZipEntry>().Where(e => e.IsFile))
{ {
var nameParts = entry.Name.Split('\\', '/').Skip(1).ToList(); var nameParts = entry.Name.Split('\\', '/').Skip(1).ToList();
var zipEntryPath = string.Join('/', nameParts); var zipEntryPath = string.Join('/', nameParts);
var isBinaryFile = binaryRegex.IsMatch(zipEntryPath); var isBinaryFile = binaryRegex.IsMatch(zipEntryPath);
var isLicenseFile = licenseRegex.IsMatch(zipEntryPath); var isLicenseFile = licenseRegex.IsMatch(zipEntryPath);
if (isBinaryFile || isLicenseFile) if (isBinaryFile || isLicenseFile)
{ {
var destinationPathParts = isLicenseFile ? nameParts.Prepend(ProductDirectoryName(download.Product)) : nameParts; var destinationPathParts = isLicenseFile ? nameParts.Prepend(ProductDirectoryName(download.Product)) : nameParts;
var destinationFile = new FileInfo(Path.Combine(destinationPathParts.Prepend(extractDirectory.FullName).ToArray())); var destinationFile = new FileInfo(Path.Combine(destinationPathParts.Prepend(extractDirectory.FullName).ToArray()));
destinationFile.Directory?.Create(); destinationFile.Directory?.Create();
await using var destinationStream = destinationFile.OpenWrite(); await using var destinationStream = destinationFile.OpenWrite();
await using var inputStream = zipFile.GetInputStream(entry); await using var inputStream = zipFile.GetInputStream(entry);
await inputStream.CopyToAsync(destinationStream, cancellationToken); await inputStream.CopyToAsync(destinationStream, cancellationToken);
if (isBinaryFile && _binaryStripper is not null) if (isBinaryFile && _binaryStripper is not null)
{ {
stripTasks.Add(_binaryStripper.StripAsync(destinationFile, cancellationToken)); stripTasks.Add(_binaryStripper.StripAsync(destinationFile, cancellationToken));
} }
} }
} }
progress.Report(new CopyProgress(stopwatch.Elapsed, 0, bytesTransferred, bytesTransferred)); progress.Report(new CopyProgress(stopwatch.Elapsed, 0, bytesTransferred, bytesTransferred));
return stripTasks; return stripTasks;
} }
public IEnumerable<Task<ByteSize>> ExtractArchive(Download download, FileInfo archive, DirectoryInfo extractDirectory, CancellationToken cancellationToken) public IEnumerable<Task<ByteSize>> ExtractArchive(Download download, FileInfo archive, DirectoryInfo extractDirectory, CancellationToken cancellationToken)
{ {
switch (Path.GetExtension(archive.Name)) switch (Path.GetExtension(archive.Name))
{ {
case ".tgz": case ".tgz":
return ExtractTarGzipArchive(download, archive, extractDirectory, cancellationToken); return ExtractTarGzipArchive(download, archive, extractDirectory, cancellationToken);
default: default:
throw new NotSupportedException($"Only .tgz archives are currently supported. \"{archive.FullName}\" can not be extracted."); throw new NotSupportedException($"Only .tgz archives are currently supported. \"{archive.FullName}\" can not be extracted.");
} }
} }
private IEnumerable<Task<ByteSize>> ExtractTarGzipArchive(Download download, FileInfo archive, DirectoryInfo extractDirectory, CancellationToken cancellationToken) private IEnumerable<Task<ByteSize>> ExtractTarGzipArchive(Download download, FileInfo archive, DirectoryInfo extractDirectory, CancellationToken cancellationToken)
{ {
// See https://github.com/icsharpcode/SharpZipLib/wiki/GZip-and-Tar-Samples#-simple-full-extract-from-a-tgz-targz // See https://github.com/icsharpcode/SharpZipLib/wiki/GZip-and-Tar-Samples#-simple-full-extract-from-a-tgz-targz
using var archiveStream = archive.OpenRead(); using var archiveStream = archive.OpenRead();
using var gzipStream = new GZipInputStream(archiveStream); using var gzipStream = new GZipInputStream(archiveStream);
using var tarArchive = TarArchive.CreateInputTarArchive(gzipStream, Encoding.UTF8); using var tarArchive = TarArchive.CreateInputTarArchive(gzipStream, Encoding.UTF8);
var extractedFileNames = new List<string>(); var extractedFileNames = new List<string>();
tarArchive.ProgressMessageEvent += (_, entry, _) => tarArchive.ProgressMessageEvent += (_, entry, _) =>
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
extractedFileNames.Add(entry.Name); extractedFileNames.Add(entry.Name);
}; };
tarArchive.ExtractContents(extractDirectory.FullName); tarArchive.ExtractContents(extractDirectory.FullName);
return CleanupExtractedFiles(download, extractDirectory, extractedFileNames); return CleanupExtractedFiles(download, extractDirectory, extractedFileNames);
} }
private IEnumerable<Task<ByteSize>> CleanupExtractedFiles(Download download, DirectoryInfo extractDirectory, IEnumerable<string> extractedFileNames) private IEnumerable<Task<ByteSize>> CleanupExtractedFiles(Download download, DirectoryInfo extractDirectory, IEnumerable<string> extractedFileNames)
{ {
var rootDirectoryToDelete = new HashSet<string>(); var rootDirectoryToDelete = new HashSet<string>();
var binaryRegex = _options.Binaries[(download.Product, download.Platform)]; var binaryRegex = _options.Binaries[(download.Product, download.Platform)];
var licenseRegex = _options.Licenses[(download.Product, download.Platform)]; var licenseRegex = _options.Licenses[(download.Product, download.Platform)];
var stripTasks = new List<Task<ByteSize>>(); var stripTasks = new List<Task<ByteSize>>();
foreach (var extractedFileName in extractedFileNames.Select(e => e.Replace('\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar))) foreach (var extractedFileName in extractedFileNames.Select(e => e.Replace('\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar)))
{ {
var extractedFile = new FileInfo(Path.Combine(extractDirectory.FullName, extractedFileName)); var extractedFile = new FileInfo(Path.Combine(extractDirectory.FullName, extractedFileName));
var parts = extractedFileName.Split(Path.DirectorySeparatorChar); var parts = extractedFileName.Split(Path.DirectorySeparatorChar);
var entryFileName = string.Join("/", parts.Skip(1)); var entryFileName = string.Join("/", parts.Skip(1));
rootDirectoryToDelete.Add(parts[0]); rootDirectoryToDelete.Add(parts[0]);
var isBinaryFile = binaryRegex.IsMatch(entryFileName); var isBinaryFile = binaryRegex.IsMatch(entryFileName);
var isLicenseFile = licenseRegex.IsMatch(entryFileName); var isLicenseFile = licenseRegex.IsMatch(entryFileName);
if (!(isBinaryFile || isLicenseFile)) if (!(isBinaryFile || isLicenseFile))
{ {
extractedFile.Delete(); extractedFile.Delete();
} }
else else
{ {
var destinationPathParts = parts.Skip(1); var destinationPathParts = parts.Skip(1);
if (isLicenseFile) if (isLicenseFile)
{ {
destinationPathParts = destinationPathParts.Prepend(ProductDirectoryName(download.Product)); destinationPathParts = destinationPathParts.Prepend(ProductDirectoryName(download.Product));
} }
var destinationFile = new FileInfo(Path.Combine(destinationPathParts.Prepend(extractDirectory.FullName).ToArray())); var destinationFile = new FileInfo(Path.Combine(destinationPathParts.Prepend(extractDirectory.FullName).ToArray()));
destinationFile.Directory?.Create(); destinationFile.Directory?.Create();
extractedFile.MoveTo(destinationFile.FullName); extractedFile.MoveTo(destinationFile.FullName);
if (isBinaryFile && _binaryStripper is not null) if (isBinaryFile && _binaryStripper is not null)
{ {
stripTasks.Add(_binaryStripper.StripAsync(destinationFile)); stripTasks.Add(_binaryStripper.StripAsync(destinationFile));
} }
} }
} }
var rootArchiveDirectory = new DirectoryInfo(Path.Combine(extractDirectory.FullName, rootDirectoryToDelete.Single())); var rootArchiveDirectory = new DirectoryInfo(Path.Combine(extractDirectory.FullName, rootDirectoryToDelete.Single()));
var binDirectory = new DirectoryInfo(Path.Combine(rootArchiveDirectory.FullName, "bin")); var binDirectory = new DirectoryInfo(Path.Combine(rootArchiveDirectory.FullName, "bin"));
binDirectory.Delete(recursive: false); binDirectory.Delete(recursive: false);
rootArchiveDirectory.Delete(recursive: false); rootArchiveDirectory.Delete(recursive: false);
return stripTasks; return stripTasks;
} }
private static string ProductDirectoryName(Product product) private static string ProductDirectoryName(Product product)
{ {
return product switch return product switch
{ {
Product.CommunityServer => "community-server", Product.CommunityServer => "community-server",
Product.DatabaseTools => "database-tools", Product.DatabaseTools => "database-tools",
_ => throw new ArgumentOutOfRangeException(nameof(product), product, null) _ => throw new ArgumentOutOfRangeException(nameof(product), product, null)
}; };
} }
} }
} }

View File

@@ -1,89 +1,89 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using ByteSizeLib; using ByteSizeLib;
using HttpProgress; using HttpProgress;
using Spectre.Console; using Spectre.Console;
namespace MongoDownloader namespace MongoDownloader
{ {
public class ArchiveProgress : IProgress<ICopyProgress> public class ArchiveProgress : IProgress<ICopyProgress>
{ {
private readonly ProgressTask _archiveProgress; private readonly ProgressTask _archiveProgress;
private readonly ProgressTask _globalProgress; private readonly ProgressTask _globalProgress;
private readonly IEnumerable<ProgressTask> _allArchiveProgresses; private readonly IEnumerable<ProgressTask> _allArchiveProgresses;
private readonly Download _download; private readonly Download _download;
private readonly string _completedDescription; private readonly string _completedDescription;
public ArchiveProgress(ProgressTask archiveProgress, ProgressTask globalProgress, IEnumerable<ProgressTask> allArchiveProgresses, Download download, string completedDescription) public ArchiveProgress(ProgressTask archiveProgress, ProgressTask globalProgress, IEnumerable<ProgressTask> allArchiveProgresses, Download download, string completedDescription)
{ {
_archiveProgress = archiveProgress ?? throw new ArgumentNullException(nameof(archiveProgress)); _archiveProgress = archiveProgress ?? throw new ArgumentNullException(nameof(archiveProgress));
_globalProgress = globalProgress ?? throw new ArgumentNullException(nameof(globalProgress)); _globalProgress = globalProgress ?? throw new ArgumentNullException(nameof(globalProgress));
_allArchiveProgresses = allArchiveProgresses ?? throw new ArgumentNullException(nameof(allArchiveProgresses)); _allArchiveProgresses = allArchiveProgresses ?? throw new ArgumentNullException(nameof(allArchiveProgresses));
_download = download ?? throw new ArgumentNullException(nameof(download)); _download = download ?? throw new ArgumentNullException(nameof(download));
_completedDescription = completedDescription ?? throw new ArgumentNullException(nameof(completedDescription)); _completedDescription = completedDescription ?? throw new ArgumentNullException(nameof(completedDescription));
} }
public void Report(ICopyProgress progress) public void Report(ICopyProgress progress)
{ {
_archiveProgress.Value = progress.BytesTransferred; _archiveProgress.Value = progress.BytesTransferred;
_archiveProgress.MaxValue = progress.ExpectedBytes; _archiveProgress.MaxValue = progress.ExpectedBytes;
string text; string text;
bool isIndeterminate; bool isIndeterminate;
if (progress.BytesTransferred < progress.ExpectedBytes) if (progress.BytesTransferred < progress.ExpectedBytes)
{ {
var speed = ByteSize.FromBytes(progress.BytesTransferred / progress.TransferTime.TotalSeconds); var speed = ByteSize.FromBytes(progress.BytesTransferred / progress.TransferTime.TotalSeconds);
text = $"Downloading {_download} from {_download.Archive.Url} at {speed:0.0}/s"; text = $"Downloading {_download} from {_download.Archive.Url} at {speed:0.0}/s";
isIndeterminate = false; isIndeterminate = false;
} }
else else
{ {
text = $"Downloaded {_download}"; text = $"Downloaded {_download}";
isIndeterminate = true; isIndeterminate = true;
// Cheat by subtracting 1 so that the progress stays at 99% in indeterminate mode for // Cheat by subtracting 1 so that the progress stays at 99% in indeterminate mode for
// remaining tasks (stripping) to complete with an indeterminate progress bar // remaining tasks (stripping) to complete with an indeterminate progress bar
_archiveProgress.Value = progress.BytesTransferred - 1; _archiveProgress.Value = progress.BytesTransferred - 1;
} }
Report(text, isIndeterminate); Report(text, isIndeterminate);
lock (_globalProgress) lock (_globalProgress)
{ {
_globalProgress.Value = _allArchiveProgresses.Sum(e => e.Value); _globalProgress.Value = _allArchiveProgresses.Sum(e => e.Value);
_globalProgress.MaxValue = _allArchiveProgresses.Sum(e => e.MaxValue); _globalProgress.MaxValue = _allArchiveProgresses.Sum(e => e.MaxValue);
} }
} }
public void Report(string action) public void Report(string action)
{ {
Report(action, isIndeterminate: true); Report(action, isIndeterminate: true);
} }
public void ReportCompleted(ByteSize strippedSize) public void ReportCompleted(ByteSize strippedSize)
{ {
_archiveProgress.Value = _archiveProgress.MaxValue; _archiveProgress.Value = _archiveProgress.MaxValue;
lock (_globalProgress) lock (_globalProgress)
{ {
if (_allArchiveProgresses.All(e => e.IsFinished)) if (_allArchiveProgresses.All(e => e.IsFinished))
{ {
_globalProgress.Description = _completedDescription; _globalProgress.Description = _completedDescription;
_globalProgress.Value = _globalProgress.MaxValue; _globalProgress.Value = _globalProgress.MaxValue;
} }
} }
var saved = strippedSize.Bytes > 0 ? $" (saved {strippedSize:#.#} by stripping)" : ""; var saved = strippedSize.Bytes > 0 ? $" (saved {strippedSize:#.#} by stripping)" : "";
Report($"Extracted {_download}{saved}", isIndeterminate: false); Report($"Extracted {_download}{saved}", isIndeterminate: false);
} }
private void Report(string description, bool isIndeterminate) private void Report(string description, bool isIndeterminate)
{ {
_archiveProgress.Description = description; _archiveProgress.Description = description;
_archiveProgress.IsIndeterminate = isIndeterminate; _archiveProgress.IsIndeterminate = isIndeterminate;
lock (_globalProgress) lock (_globalProgress)
{ {
_globalProgress.IsIndeterminate = _allArchiveProgresses.All(e => e.IsFinished || e.IsIndeterminate); _globalProgress.IsIndeterminate = _allArchiveProgresses.All(e => e.IsFinished || e.IsIndeterminate);
} }
} }
} }
} }

View File

@@ -1,92 +1,92 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ByteSizeLib; using ByteSizeLib;
using CliWrap; using CliWrap;
namespace MongoDownloader namespace MongoDownloader
{ {
public class BinaryStripper public class BinaryStripper
{ {
private const string LlvmStripToolName = "llvm-strip"; private const string LlvmStripToolName = "llvm-strip";
private readonly string _llvmStripPath; private readonly string _llvmStripPath;
private BinaryStripper(string llvmStripPath) private BinaryStripper(string llvmStripPath)
{ {
_llvmStripPath = llvmStripPath ?? throw new ArgumentNullException(nameof(llvmStripPath)); _llvmStripPath = llvmStripPath ?? throw new ArgumentNullException(nameof(llvmStripPath));
} }
public static async Task<BinaryStripper> CreateAsync(CancellationToken cancellationToken) public static async Task<BinaryStripper> CreateAsync(CancellationToken cancellationToken)
{ {
var llvmStripPath = await GetLlvmStripPathAsync(cancellationToken); var llvmStripPath = await GetLlvmStripPathAsync(cancellationToken);
return new BinaryStripper(llvmStripPath); return new BinaryStripper(llvmStripPath);
} }
public async Task<ByteSize> StripAsync(FileInfo executable, CancellationToken cancellationToken = default) public async Task<ByteSize> StripAsync(FileInfo executable, CancellationToken cancellationToken = default)
{ {
var sizeBefore = ByteSize.FromBytes(executable.Length); var sizeBefore = ByteSize.FromBytes(executable.Length);
await Cli.Wrap(_llvmStripPath).WithArguments(executable.FullName).ExecuteAsync(cancellationToken); await Cli.Wrap(_llvmStripPath).WithArguments(executable.FullName).ExecuteAsync(cancellationToken);
executable.Refresh(); executable.Refresh();
var sizeAfter = ByteSize.FromBytes(executable.Length); var sizeAfter = ByteSize.FromBytes(executable.Length);
return sizeBefore - sizeAfter; return sizeBefore - sizeAfter;
} }
private static async Task<string> GetLlvmStripPathAsync(CancellationToken cancellationToken) private static async Task<string> GetLlvmStripPathAsync(CancellationToken cancellationToken)
{ {
try try
{ {
await Cli.Wrap(LlvmStripToolName).WithArguments("--version").ExecuteAsync(cancellationToken); await Cli.Wrap(LlvmStripToolName).WithArguments("--version").ExecuteAsync(cancellationToken);
// llvm-strip is on the PATH // llvm-strip is on the PATH
return LlvmStripToolName; return LlvmStripToolName;
} }
catch (Win32Exception exception) when (exception.NativeErrorCode == 2) catch (Win32Exception exception) when (exception.NativeErrorCode == 2)
{ {
// llvm-strip is NOT in the PATH, let's search with homebrew // llvm-strip is NOT in the PATH, let's search with homebrew
var llvmStripToolPath = await TryGetLlvmStripPathWithHomebrew(); var llvmStripToolPath = await TryGetLlvmStripPathWithHomebrew();
if (llvmStripToolPath != null) if (llvmStripToolPath != null)
{ {
return llvmStripToolPath; return llvmStripToolPath;
} }
throw new FileNotFoundException($"The \"{LlvmStripToolName}\" tool was not found."); throw new FileNotFoundException($"The \"{LlvmStripToolName}\" tool was not found.");
} }
} }
private static async Task<string?> TryGetLlvmStripPathWithHomebrew() private static async Task<string?> TryGetLlvmStripPathWithHomebrew()
{ {
if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{ {
return null; return null;
} }
string? llvmStripToolPath = null; string? llvmStripToolPath = null;
try try
{ {
await Cli.Wrap("brew") await Cli.Wrap("brew")
// don't validate exit code, if `brew list llvm` fails it's because the llvm formula is not installed // don't validate exit code, if `brew list llvm` fails it's because the llvm formula is not installed
.WithValidation(CommandResultValidation.None) .WithValidation(CommandResultValidation.None)
.WithArguments(new[] {"list", "llvm"}) .WithArguments(new[] {"list", "llvm"})
.WithStandardOutputPipe(PipeTarget.ToDelegate(line => .WithStandardOutputPipe(PipeTarget.ToDelegate(line =>
{ {
if (llvmStripToolPath == null && line.EndsWith(LlvmStripToolName)) if (llvmStripToolPath == null && line.EndsWith(LlvmStripToolName))
{ {
llvmStripToolPath = line; llvmStripToolPath = line;
} }
})) }))
.ExecuteAsync(); .ExecuteAsync();
} }
catch (Win32Exception exception) when (exception.NativeErrorCode == 2) catch (Win32Exception exception) when (exception.NativeErrorCode == 2)
{ {
// brew is not installed // brew is not installed
return null; return null;
} }
return llvmStripToolPath; return llvmStripToolPath;
} }
} }
} }

View File

@@ -1,84 +1,84 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
// ReSharper disable AutoPropertyCanBeMadeGetOnly.Global // ReSharper disable AutoPropertyCanBeMadeGetOnly.Global
// ReSharper disable ClassNeverInstantiated.Global // ReSharper disable ClassNeverInstantiated.Global
// ReSharper disable CollectionNeverUpdated.Global // ReSharper disable CollectionNeverUpdated.Global
namespace MongoDownloader namespace MongoDownloader
{ {
public enum Platform public enum Platform
{ {
Linux, Linux,
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
macOS, macOS,
Windows, Windows,
} }
public enum Product public enum Product
{ {
CommunityServer, CommunityServer,
DatabaseTools, DatabaseTools,
} }
/// <summary> /// <summary>
/// The root object of the JSON describing the available releases. /// The root object of the JSON describing the available releases.
/// </summary> /// </summary>
public class Release public class Release
{ {
[JsonPropertyName("versions")] [JsonPropertyName("versions")]
public List<Version> Versions { get; set; } = new(); public List<Version> Versions { get; set; } = new();
} }
public class Version public class Version
{ {
[JsonPropertyName("version")] [JsonPropertyName("version")]
public string Number { get; set; } = ""; public string Number { get; set; } = "";
[JsonPropertyName("production_release")] [JsonPropertyName("production_release")]
public bool Production { get; set; } = false; public bool Production { get; set; } = false;
[JsonPropertyName("downloads")] [JsonPropertyName("downloads")]
public List<Download> Downloads { get; set; } = new(); public List<Download> Downloads { get; set; } = new();
} }
public class Download public class Download
{ {
/// <summary> /// <summary>
/// Used to identify the platform for the Community Server archives /// Used to identify the platform for the Community Server archives
/// </summary> /// </summary>
[JsonPropertyName("target")] [JsonPropertyName("target")]
public string Target { get; set; } = ""; public string Target { get; set; } = "";
/// <summary> /// <summary>
/// Used to identify the platform for the Database Tools archives /// Used to identify the platform for the Database Tools archives
/// </summary> /// </summary>
[JsonPropertyName("name")] [JsonPropertyName("name")]
public string Name { get; set; } = ""; public string Name { get; set; } = "";
[JsonPropertyName("arch")] [JsonPropertyName("arch")]
public string Arch { get; set; } = ""; public string Arch { get; set; } = "";
[JsonPropertyName("edition")] [JsonPropertyName("edition")]
public string Edition { get; set; } = ""; public string Edition { get; set; } = "";
[JsonPropertyName("archive")] [JsonPropertyName("archive")]
public Archive Archive { get; set; } = new(); public Archive Archive { get; set; } = new();
public Product Product { get; set; } public Product Product { get; set; }
public Platform Platform { get; set; } public Platform Platform { get; set; }
public Architecture Architecture { get; set; } public Architecture Architecture { get; set; }
public override string ToString() => $"{Product} for {Platform}/{Architecture.ToString().ToLowerInvariant()}"; public override string ToString() => $"{Product} for {Platform}/{Architecture.ToString().ToLowerInvariant()}";
} }
public class Archive public class Archive
{ {
[JsonPropertyName("url")] [JsonPropertyName("url")]
public Uri Url { get; set; } = default!; public Uri Url { get; set; } = default!;
} }
} }

View File

@@ -1,162 +1,162 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ByteSizeLib; using ByteSizeLib;
using HttpProgress; using HttpProgress;
using Spectre.Console; using Spectre.Console;
namespace MongoDownloader namespace MongoDownloader
{ {
internal class MongoDbDownloader internal class MongoDbDownloader
{ {
private readonly ArchiveExtractor _extractor; private readonly ArchiveExtractor _extractor;
private readonly Options _options; private readonly Options _options;
public MongoDbDownloader(ArchiveExtractor extractor, Options options) public MongoDbDownloader(ArchiveExtractor extractor, Options options)
{ {
_extractor = extractor ?? throw new ArgumentNullException(nameof(extractor)); _extractor = extractor ?? throw new ArgumentNullException(nameof(extractor));
_options = options ?? throw new ArgumentNullException(nameof(options)); _options = options ?? throw new ArgumentNullException(nameof(options));
} }
public async Task<ByteSize> RunAsync(DirectoryInfo toolsDirectory, CancellationToken cancellationToken) public async Task<ByteSize> RunAsync(DirectoryInfo toolsDirectory, CancellationToken cancellationToken)
{ {
var strippedSize = await AnsiConsole var strippedSize = await AnsiConsole
.Progress() .Progress()
.Columns( .Columns(
new ProgressBarColumn(), new ProgressBarColumn(),
new PercentageColumn(), new PercentageColumn(),
new RemainingTimeColumn(), new RemainingTimeColumn(),
new DownloadedColumn(), new DownloadedColumn(),
new TaskDescriptionColumn { Alignment = Justify.Left } new TaskDescriptionColumn { Alignment = Justify.Left }
) )
.StartAsync(async context => await RunAsync(context, toolsDirectory, cancellationToken)); .StartAsync(async context => await RunAsync(context, toolsDirectory, cancellationToken));
return strippedSize; return strippedSize;
} }
private async Task<ByteSize> RunAsync(ProgressContext context, DirectoryInfo toolsDirectory, CancellationToken cancellationToken) private async Task<ByteSize> RunAsync(ProgressContext context, DirectoryInfo toolsDirectory, CancellationToken cancellationToken)
{ {
const double initialMaxValue = double.Epsilon; const double initialMaxValue = double.Epsilon;
var globalProgress = context.AddTask("Downloading MongoDB", maxValue: initialMaxValue); var globalProgress = context.AddTask("Downloading MongoDB", maxValue: initialMaxValue);
var (communityServerVersion, communityServerDownloads) = await GetCommunityServerDownloadsAsync(cancellationToken); var (communityServerVersion, communityServerDownloads) = await GetCommunityServerDownloadsAsync(cancellationToken);
globalProgress.Description = $"Downloading MongoDB Community Server {communityServerVersion.Number}"; globalProgress.Description = $"Downloading MongoDB Community Server {communityServerVersion.Number}";
var (databaseToolsVersion, databaseToolsDownloads) = await GetDatabaseToolsDownloadsAsync(cancellationToken); var (databaseToolsVersion, databaseToolsDownloads) = await GetDatabaseToolsDownloadsAsync(cancellationToken);
globalProgress.Description = $"Downloading MongoDB Community Server {communityServerVersion.Number} and Database Tools {databaseToolsVersion.Number}"; globalProgress.Description = $"Downloading MongoDB Community Server {communityServerVersion.Number} and Database Tools {databaseToolsVersion.Number}";
var tasks = new List<Task<ByteSize>>(); var tasks = new List<Task<ByteSize>>();
var allArchiveProgresses = new List<ProgressTask>(); var allArchiveProgresses = new List<ProgressTask>();
foreach (var download in communityServerDownloads.Concat(databaseToolsDownloads)) foreach (var download in communityServerDownloads.Concat(databaseToolsDownloads))
{ {
var archiveProgress = context.AddTask($"Downloading {download} from {download.Archive.Url}", maxValue: initialMaxValue); var archiveProgress = context.AddTask($"Downloading {download} from {download.Archive.Url}", maxValue: initialMaxValue);
var directoryName = $"mongodb-{download.Platform.ToString().ToLowerInvariant()}-{download.Architecture.ToString().ToLowerInvariant()}-{communityServerVersion.Number}-database-tools-{databaseToolsVersion.Number}"; var directoryName = $"mongodb-{download.Platform.ToString().ToLowerInvariant()}-{download.Architecture.ToString().ToLowerInvariant()}-{communityServerVersion.Number}-database-tools-{databaseToolsVersion.Number}";
var extractDirectory = new DirectoryInfo(Path.Combine(toolsDirectory.FullName, directoryName)); var extractDirectory = new DirectoryInfo(Path.Combine(toolsDirectory.FullName, directoryName));
allArchiveProgresses.Add(archiveProgress); allArchiveProgresses.Add(archiveProgress);
var progress = new ArchiveProgress(archiveProgress, globalProgress, allArchiveProgresses, download, $"✅ Downloaded and extracted MongoDB Community Server {communityServerVersion.Number} and Database Tools {databaseToolsVersion.Number} into {new Uri(toolsDirectory.FullName).AbsoluteUri}"); var progress = new ArchiveProgress(archiveProgress, globalProgress, allArchiveProgresses, download, $"✅ Downloaded and extracted MongoDB Community Server {communityServerVersion.Number} and Database Tools {databaseToolsVersion.Number} into {new Uri(toolsDirectory.FullName).AbsoluteUri}");
tasks.Add(ProcessArchiveAsync(download, extractDirectory, progress, cancellationToken)); tasks.Add(ProcessArchiveAsync(download, extractDirectory, progress, cancellationToken));
} }
var strippedSizes = await Task.WhenAll(tasks); var strippedSizes = await Task.WhenAll(tasks);
return strippedSizes.Aggregate(new ByteSize(0), (current, strippedSize) => current + strippedSize); return strippedSizes.Aggregate(new ByteSize(0), (current, strippedSize) => current + strippedSize);
} }
private async Task<ByteSize> ProcessArchiveAsync(Download download, DirectoryInfo extractDirectory, ArchiveProgress progress, CancellationToken cancellationToken) private async Task<ByteSize> ProcessArchiveAsync(Download download, DirectoryInfo extractDirectory, ArchiveProgress progress, CancellationToken cancellationToken)
{ {
IEnumerable<Task<ByteSize>> stripTasks; IEnumerable<Task<ByteSize>> stripTasks;
var archiveExtension = Path.GetExtension(download.Archive.Url.AbsolutePath); var archiveExtension = Path.GetExtension(download.Archive.Url.AbsolutePath);
if (archiveExtension == ".zip") if (archiveExtension == ".zip")
{ {
stripTasks = await _extractor.DownloadExtractZipArchiveAsync(download, extractDirectory, progress, cancellationToken); stripTasks = await _extractor.DownloadExtractZipArchiveAsync(download, extractDirectory, progress, cancellationToken);
} }
else else
{ {
var archiveFileInfo = await DownloadArchiveAsync(download.Archive, progress, cancellationToken); var archiveFileInfo = await DownloadArchiveAsync(download.Archive, progress, cancellationToken);
stripTasks = _extractor.ExtractArchive(download, archiveFileInfo, extractDirectory, cancellationToken); stripTasks = _extractor.ExtractArchive(download, archiveFileInfo, extractDirectory, cancellationToken);
} }
progress.Report("Stripping binaries"); progress.Report("Stripping binaries");
var completedStripTasks = await Task.WhenAll(stripTasks); var completedStripTasks = await Task.WhenAll(stripTasks);
var totalStrippedSize = completedStripTasks.Aggregate(new ByteSize(0), (current, strippedSize) => current + strippedSize); var totalStrippedSize = completedStripTasks.Aggregate(new ByteSize(0), (current, strippedSize) => current + strippedSize);
progress.ReportCompleted(totalStrippedSize); progress.ReportCompleted(totalStrippedSize);
return totalStrippedSize; return totalStrippedSize;
} }
private async Task<FileInfo> DownloadArchiveAsync(Archive archive, IProgress<ICopyProgress> progress, CancellationToken cancellationToken) private async Task<FileInfo> DownloadArchiveAsync(Archive archive, IProgress<ICopyProgress> progress, CancellationToken cancellationToken)
{ {
_options.CacheDirectory.Create(); _options.CacheDirectory.Create();
var destinationFile = new FileInfo(Path.Combine(_options.CacheDirectory.FullName, archive.Url.Segments.Last())); var destinationFile = new FileInfo(Path.Combine(_options.CacheDirectory.FullName, archive.Url.Segments.Last()));
var useCache = bool.TryParse(Environment.GetEnvironmentVariable("MONGO2GO_DOWNLOADER_USE_CACHED_FILE") ?? "", out var useCachedFile) && useCachedFile; var useCache = bool.TryParse(Environment.GetEnvironmentVariable("MONGO2GO_DOWNLOADER_USE_CACHED_FILE") ?? "", out var useCachedFile) && useCachedFile;
if (useCache && destinationFile.Exists) if (useCache && destinationFile.Exists)
{ {
progress.Report(new CopyProgress(TimeSpan.Zero, 0, 1, 1)); progress.Report(new CopyProgress(TimeSpan.Zero, 0, 1, 1));
return destinationFile; return destinationFile;
} }
await using var destinationStream = destinationFile.OpenWrite(); await using var destinationStream = destinationFile.OpenWrite();
await _options.HttpClient.GetAsync(archive.Url.AbsoluteUri, destinationStream, progress, cancellationToken); await _options.HttpClient.GetAsync(archive.Url.AbsoluteUri, destinationStream, progress, cancellationToken);
return destinationFile; return destinationFile;
} }
private async Task<(Version version, IEnumerable<Download> downloads)> GetCommunityServerDownloadsAsync(CancellationToken cancellationToken) private async Task<(Version version, IEnumerable<Download> downloads)> GetCommunityServerDownloadsAsync(CancellationToken cancellationToken)
{ {
var release = await _options.HttpClient.GetFromJsonAsync<Release>(_options.CommunityServerUrl, cancellationToken) ?? throw new InvalidOperationException($"Failed to deserialize {nameof(Release)}"); var release = await _options.HttpClient.GetFromJsonAsync<Release>(_options.CommunityServerUrl, cancellationToken) ?? throw new InvalidOperationException($"Failed to deserialize {nameof(Release)}");
var version = release.Versions.FirstOrDefault(e => e.Production) ?? throw new InvalidOperationException("No Community Server production version was found"); var version = release.Versions.FirstOrDefault(e => e.Production) ?? throw new InvalidOperationException("No Community Server production version was found");
var downloads = Enum.GetValues<Platform>().SelectMany(platform => GetDownloads(platform, Product.CommunityServer, version, _options, _options.Edition)); var downloads = Enum.GetValues<Platform>().SelectMany(platform => GetDownloads(platform, Product.CommunityServer, version, _options, _options.Edition));
return (version, downloads); return (version, downloads);
} }
private async Task<(Version version, IEnumerable<Download> downloads)> GetDatabaseToolsDownloadsAsync(CancellationToken cancellationToken) private async Task<(Version version, IEnumerable<Download> downloads)> GetDatabaseToolsDownloadsAsync(CancellationToken cancellationToken)
{ {
var release = await _options.HttpClient.GetFromJsonAsync<Release>(_options.DatabaseToolsUrl, cancellationToken) ?? throw new InvalidOperationException($"Failed to deserialize {nameof(Release)}"); var release = await _options.HttpClient.GetFromJsonAsync<Release>(_options.DatabaseToolsUrl, cancellationToken) ?? throw new InvalidOperationException($"Failed to deserialize {nameof(Release)}");
var version = release.Versions.FirstOrDefault() ?? throw new InvalidOperationException("No Database Tools version was found"); var version = release.Versions.FirstOrDefault() ?? throw new InvalidOperationException("No Database Tools version was found");
var downloads = Enum.GetValues<Platform>().SelectMany(platform => GetDownloads(platform, Product.DatabaseTools, version, _options)); var downloads = Enum.GetValues<Platform>().SelectMany(platform => GetDownloads(platform, Product.DatabaseTools, version, _options));
return (version, downloads); return (version, downloads);
} }
private static IEnumerable<Download> GetDownloads(Platform platform, Product product, Version version, Options options, Regex? editionRegex = null) private static IEnumerable<Download> GetDownloads(Platform platform, Product product, Version version, Options options, Regex? editionRegex = null)
{ {
var platformRegex = options.PlatformIdentifiers[platform]; var platformRegex = options.PlatformIdentifiers[platform];
Func<Download, bool> platformPredicate = product switch Func<Download, bool> platformPredicate = product switch
{ {
Product.CommunityServer => download => platformRegex.IsMatch(download.Target), Product.CommunityServer => download => platformRegex.IsMatch(download.Target),
Product.DatabaseTools => download => platformRegex.IsMatch(download.Name), Product.DatabaseTools => download => platformRegex.IsMatch(download.Name),
_ => throw new ArgumentOutOfRangeException(nameof(product), product, $"The value of argument '{nameof(product)}' ({product}) is invalid for enum type '{nameof(Product)}'.") _ => throw new ArgumentOutOfRangeException(nameof(product), product, $"The value of argument '{nameof(product)}' ({product}) is invalid for enum type '{nameof(Product)}'.")
}; };
foreach (var architecture in options.Architectures[platform]) foreach (var architecture in options.Architectures[platform])
{ {
var architectureRegex = options.ArchitectureIdentifiers[architecture]; var architectureRegex = options.ArchitectureIdentifiers[architecture];
var matchingDownloads = version.Downloads var matchingDownloads = version.Downloads
.Where(platformPredicate) .Where(platformPredicate)
.Where(e => architectureRegex.IsMatch(e.Arch)) .Where(e => architectureRegex.IsMatch(e.Arch))
.Where(e => editionRegex?.IsMatch(e.Edition) ?? true) .Where(e => editionRegex?.IsMatch(e.Edition) ?? true)
.ToList(); .ToList();
if (matchingDownloads.Count == 0) if (matchingDownloads.Count == 0)
{ {
var downloads = version.Downloads.OrderBy(e => e.Target).ThenBy(e => e.Arch); var downloads = version.Downloads.OrderBy(e => e.Target).ThenBy(e => e.Arch);
var messages = Enumerable.Empty<string>() var messages = Enumerable.Empty<string>()
.Append($"Download not found for {platform}/{architecture}.") .Append($"Download not found for {platform}/{architecture}.")
.Append($" Available downloads for {product} {version.Number}:") .Append($" Available downloads for {product} {version.Number}:")
.Concat(downloads.Select(e => $" - {e.Target}/{e.Arch} ({e.Edition})")); .Concat(downloads.Select(e => $" - {e.Target}/{e.Arch} ({e.Edition})"));
throw new InvalidOperationException(string.Join(Environment.NewLine, messages)); throw new InvalidOperationException(string.Join(Environment.NewLine, messages));
} }
if (matchingDownloads.Count > 1) if (matchingDownloads.Count > 1)
{ {
throw new InvalidOperationException($"Found {matchingDownloads.Count} downloads for {platform}/{architecture} but expected to find only one."); throw new InvalidOperationException($"Found {matchingDownloads.Count} downloads for {platform}/{architecture} but expected to find only one.");
} }
var download = matchingDownloads[0]; var download = matchingDownloads[0];
download.Platform = platform; download.Platform = platform;
download.Architecture = architecture; download.Architecture = architecture;
download.Product = product; download.Product = product;
yield return download; yield return download;
} }
} }
} }
} }

View File

@@ -1,21 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="bloomtom.HttpProgress" Version="2.3.2" /> <PackageReference Include="bloomtom.HttpProgress" Version="2.3.2" />
<PackageReference Include="ByteSize" Version="2.1.0" /> <PackageReference Include="ByteSize" Version="2.1.0" />
<PackageReference Include="CliWrap" Version="3.3.3" /> <PackageReference Include="CliWrap" Version="3.3.3" />
<PackageReference Include="Espresso3389.HttpStream" Version="2.0.52.3" /> <PackageReference Include="Espresso3389.HttpStream" Version="2.0.52.3" />
<PackageReference Include="SharpZipLib" Version="1.3.3" /> <PackageReference Include="SharpZipLib" Version="1.3.3" />
<PackageReference Include="Spectre.Console" Version="0.42.0" /> <PackageReference Include="Spectre.Console" Version="0.42.0" />
<PackageReference Include="System.Net.Http" Version="4.3.4" /> <PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" /> <PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,100 +1,100 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net.Http; using System.Net.Http;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace MongoDownloader namespace MongoDownloader
{ {
internal class Options internal class Options
{ {
/// <summary> /// <summary>
/// The <see cref="HttpClient"/> instance used to fetch data over HTTP. /// The <see cref="HttpClient"/> instance used to fetch data over HTTP.
/// </summary> /// </summary>
public HttpClient HttpClient { get; init; } = new(); public HttpClient HttpClient { get; init; } = new();
/// <summary> /// <summary>
/// The URL of the MongoDB Community Server download information JSON. /// The URL of the MongoDB Community Server download information JSON.
/// </summary> /// </summary>
public string CommunityServerUrl { get; init; } = "https://s3.amazonaws.com/downloads.mongodb.org/current.json"; public string CommunityServerUrl { get; init; } = "https://s3.amazonaws.com/downloads.mongodb.org/current.json";
/// <summary> /// <summary>
/// The URL of the MongoDB Database Tools download information JSON. /// The URL of the MongoDB Database Tools download information JSON.
/// </summary> /// </summary>
public string DatabaseToolsUrl { get; init; } = "https://s3.amazonaws.com/downloads.mongodb.org/tools/db/release.json"; public string DatabaseToolsUrl { get; init; } = "https://s3.amazonaws.com/downloads.mongodb.org/tools/db/release.json";
/// <summary> /// <summary>
/// The directory to store the downloaded archive files. /// The directory to store the downloaded archive files.
/// </summary> /// </summary>
public DirectoryInfo CacheDirectory { get; init; } = new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), nameof(MongoDownloader))); public DirectoryInfo CacheDirectory { get; init; } = new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), nameof(MongoDownloader)));
/// <summary> /// <summary>
/// The architectures to download for a given platform. /// The architectures to download for a given platform.
/// </summary> /// </summary>
public IReadOnlyDictionary<Platform, IReadOnlyCollection<Architecture>> Architectures { get; init; } = new Dictionary<Platform, IReadOnlyCollection<Architecture>> public IReadOnlyDictionary<Platform, IReadOnlyCollection<Architecture>> Architectures { get; init; } = new Dictionary<Platform, IReadOnlyCollection<Architecture>>
{ {
[Platform.Linux] = new[] { Architecture.Arm64, Architecture.X64 }, [Platform.Linux] = new[] { Architecture.Arm64, Architecture.X64 },
[Platform.macOS] = new[] { Architecture.X64 }, [Platform.macOS] = new[] { Architecture.X64 },
[Platform.Windows] = new[] { Architecture.X64 }, [Platform.Windows] = new[] { Architecture.X64 },
}; };
/// <summary> /// <summary>
/// The edition of the archive to download. /// The edition of the archive to download.
/// </summary> /// </summary>
/// <remarks>macOS and Windows use <c>base</c> and Linux uses <c>targeted</c> for the community edition</remarks> /// <remarks>macOS and Windows use <c>base</c> and Linux uses <c>targeted</c> for the community edition</remarks>
public Regex Edition { get; init; } = new(@"base|targeted"); public Regex Edition { get; init; } = new(@"base|targeted");
/// <summary> /// <summary>
/// The regular expressions used to identify platform-specific archives to download. /// The regular expressions used to identify platform-specific archives to download.
/// </summary> /// </summary>
public IReadOnlyDictionary<Platform, Regex> PlatformIdentifiers { get; init; } = new Dictionary<Platform, Regex> public IReadOnlyDictionary<Platform, Regex> PlatformIdentifiers { get; init; } = new Dictionary<Platform, Regex>
{ {
[Platform.Linux] = new(@"ubuntu2004", RegexOptions.IgnoreCase), [Platform.Linux] = new(@"ubuntu2004", RegexOptions.IgnoreCase),
[Platform.macOS] = new(@"macOS", RegexOptions.IgnoreCase), [Platform.macOS] = new(@"macOS", RegexOptions.IgnoreCase),
[Platform.Windows] = new(@"windows", RegexOptions.IgnoreCase), [Platform.Windows] = new(@"windows", RegexOptions.IgnoreCase),
}; };
/// <summary> /// <summary>
/// The regular expressions used to identify architectures to download. /// The regular expressions used to identify architectures to download.
/// </summary> /// </summary>
public IReadOnlyDictionary<Architecture, Regex> ArchitectureIdentifiers { get; init; } = new Dictionary<Architecture, Regex> public IReadOnlyDictionary<Architecture, Regex> ArchitectureIdentifiers { get; init; } = new Dictionary<Architecture, Regex>
{ {
[Architecture.Arm64] = new("arm64|aarch64", RegexOptions.IgnoreCase), [Architecture.Arm64] = new("arm64|aarch64", RegexOptions.IgnoreCase),
[Architecture.X64] = new("x86_64", RegexOptions.IgnoreCase), [Architecture.X64] = new("x86_64", RegexOptions.IgnoreCase),
}; };
/// <summary> /// <summary>
/// A dictionary describing how to match MongoDB binaries inside the zip archives. /// A dictionary describing how to match MongoDB binaries inside the zip archives.
/// <para/> /// <para/>
/// The key is a tuple with the <see cref="Product"/>/<see cref="Platform"/> and the /// The key is a tuple with the <see cref="Product"/>/<see cref="Platform"/> and the
/// value is a regular expressions to match against the zip file name entry. /// value is a regular expressions to match against the zip file name entry.
/// </summary> /// </summary>
public IReadOnlyDictionary<(Product, Platform), Regex> Binaries { get; init; } = new Dictionary<(Product, Platform), Regex> public IReadOnlyDictionary<(Product, Platform), Regex> Binaries { get; init; } = new Dictionary<(Product, Platform), Regex>
{ {
[(Product.CommunityServer, Platform.Linux)] = new(@"bin/mongod"), [(Product.CommunityServer, Platform.Linux)] = new(@"bin/mongod"),
[(Product.CommunityServer, Platform.macOS)] = new(@"bin/mongod"), [(Product.CommunityServer, Platform.macOS)] = new(@"bin/mongod"),
[(Product.CommunityServer, Platform.Windows)] = new(@"bin/mongod\.exe"), [(Product.CommunityServer, Platform.Windows)] = new(@"bin/mongod\.exe"),
[(Product.DatabaseTools, Platform.Linux)] = new(@"bin/(mongoexport|mongoimport)"), [(Product.DatabaseTools, Platform.Linux)] = new(@"bin/(mongoexport|mongoimport)"),
[(Product.DatabaseTools, Platform.macOS)] = new(@"bin/(mongoexport|mongoimport)"), [(Product.DatabaseTools, Platform.macOS)] = new(@"bin/(mongoexport|mongoimport)"),
[(Product.DatabaseTools, Platform.Windows)] = new(@"bin/(mongoexport|mongoimport)\.exe"), [(Product.DatabaseTools, Platform.Windows)] = new(@"bin/(mongoexport|mongoimport)\.exe"),
}; };
/// <summary> /// <summary>
/// A dictionary describing how to match licence files inside the zip archives. /// A dictionary describing how to match licence files inside the zip archives.
/// <para/> /// <para/>
/// The key is a tuple with the <see cref="Product"/>/<see cref="Platform"/> and the /// The key is a tuple with the <see cref="Product"/>/<see cref="Platform"/> and the
/// value is a regular expressions to match against the zip file name entry. /// value is a regular expressions to match against the zip file name entry.
/// </summary> /// </summary>
public IReadOnlyDictionary<(Product, Platform), Regex> Licenses { get; init; } = new Dictionary<(Product, Platform), Regex> public IReadOnlyDictionary<(Product, Platform), Regex> Licenses { get; init; } = new Dictionary<(Product, Platform), Regex>
{ {
// The regular expression matches anything at the zip top level, i.e. does not contain any slash (/) character // The regular expression matches anything at the zip top level, i.e. does not contain any slash (/) character
[(Product.CommunityServer, Platform.Linux)] = new(@"^[^/]+$"), [(Product.CommunityServer, Platform.Linux)] = new(@"^[^/]+$"),
[(Product.CommunityServer, Platform.macOS)] = new(@"^[^/]+$"), [(Product.CommunityServer, Platform.macOS)] = new(@"^[^/]+$"),
[(Product.CommunityServer, Platform.Windows)] = new(@"^[^/]+$"), [(Product.CommunityServer, Platform.Windows)] = new(@"^[^/]+$"),
[(Product.DatabaseTools, Platform.Linux)] = new(@"^[^/]+$"), [(Product.DatabaseTools, Platform.Linux)] = new(@"^[^/]+$"),
[(Product.DatabaseTools, Platform.macOS)] = new(@"^[^/]+$"), [(Product.DatabaseTools, Platform.macOS)] = new(@"^[^/]+$"),
[(Product.DatabaseTools, Platform.Windows)] = new(@"^[^/]+$"), [(Product.DatabaseTools, Platform.Windows)] = new(@"^[^/]+$"),
}; };
} }
} }

View File

@@ -1,86 +1,86 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Spectre.Console; using Spectre.Console;
namespace MongoDownloader namespace MongoDownloader
{ {
internal static class Program internal static class Program
{ {
private static async Task<int> Main(string[] args) private static async Task<int> Main(string[] args)
{ {
try try
{ {
var toolsDirectory = GetToolsDirectory(); var toolsDirectory = GetToolsDirectory();
foreach (DirectoryInfo dir in toolsDirectory.EnumerateDirectories()) foreach (DirectoryInfo dir in toolsDirectory.EnumerateDirectories())
{ {
dir.Delete(true); dir.Delete(true);
} }
var cancellationTokenSource = new CancellationTokenSource(); var cancellationTokenSource = new CancellationTokenSource();
Console.CancelKeyPress += (_, eventArgs) => Console.CancelKeyPress += (_, eventArgs) =>
{ {
// Try to cancel gracefully the first time, then abort the process the second time Ctrl+C is pressed // Try to cancel gracefully the first time, then abort the process the second time Ctrl+C is pressed
eventArgs.Cancel = !cancellationTokenSource.IsCancellationRequested; eventArgs.Cancel = !cancellationTokenSource.IsCancellationRequested;
cancellationTokenSource.Cancel(); cancellationTokenSource.Cancel();
}; };
var options = new Options(); var options = new Options();
var performStrip = args.All(e => e != "--no-strip"); var performStrip = args.All(e => e != "--no-strip");
var binaryStripper = performStrip ? await GetBinaryStripperAsync(cancellationTokenSource.Token) : null; var binaryStripper = performStrip ? await GetBinaryStripperAsync(cancellationTokenSource.Token) : null;
var archiveExtractor = new ArchiveExtractor(options, binaryStripper); var archiveExtractor = new ArchiveExtractor(options, binaryStripper);
var downloader = new MongoDbDownloader(archiveExtractor, options); var downloader = new MongoDbDownloader(archiveExtractor, options);
var strippedSize = await downloader.RunAsync(toolsDirectory, cancellationTokenSource.Token); var strippedSize = await downloader.RunAsync(toolsDirectory, cancellationTokenSource.Token);
if (performStrip) if (performStrip)
{ {
AnsiConsole.WriteLine($"Saved {strippedSize:#.#} by stripping executables"); AnsiConsole.WriteLine($"Saved {strippedSize:#.#} by stripping executables");
} }
return 0; return 0;
} }
catch (Exception exception) catch (Exception exception)
{ {
if (exception is not OperationCanceledException) if (exception is not OperationCanceledException)
{ {
AnsiConsole.WriteException(exception, ExceptionFormats.ShortenPaths); AnsiConsole.WriteException(exception, ExceptionFormats.ShortenPaths);
} }
return 1; return 1;
} }
} }
private static DirectoryInfo GetToolsDirectory() private static DirectoryInfo GetToolsDirectory()
{ {
for (var directory = new DirectoryInfo("."); directory != null; directory = directory.Parent) for (var directory = new DirectoryInfo("."); directory != null; directory = directory.Parent)
{ {
var toolsDirectory = directory.GetDirectories("tools", SearchOption.TopDirectoryOnly).SingleOrDefault(); var toolsDirectory = directory.GetDirectories("tools", SearchOption.TopDirectoryOnly).SingleOrDefault();
if (toolsDirectory?.Exists ?? false) if (toolsDirectory?.Exists ?? false)
{ {
return toolsDirectory; return toolsDirectory;
} }
} }
throw new InvalidOperationException("The tools directory was not found"); throw new InvalidOperationException("The tools directory was not found");
} }
private static async Task<BinaryStripper?> GetBinaryStripperAsync(CancellationToken cancellationToken) private static async Task<BinaryStripper?> GetBinaryStripperAsync(CancellationToken cancellationToken)
{ {
try try
{ {
return await BinaryStripper.CreateAsync(cancellationToken); return await BinaryStripper.CreateAsync(cancellationToken);
} }
catch (FileNotFoundException exception) catch (FileNotFoundException exception)
{ {
string installCommand; string installCommand;
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
installCommand = "brew install llvm"; installCommand = "brew install llvm";
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
installCommand = "scoop install llvm"; installCommand = "scoop install llvm";
else else
installCommand = "apt-get install llvm"; installCommand = "apt-get install llvm";
throw new Exception($"{exception.Message} Either install llvm with `{installCommand}` or run MongoDownloader with the --no-strip option to skip binary stripping.", exception); throw new Exception($"{exception.Message} Either install llvm with `{installCommand}` or run MongoDownloader with the --no-strip option to skip binary stripping.", exception);
} }
} }
} }
} }

View File

@@ -1,11 +1,11 @@
The binaries in this directory are automatically downloaded with the `MongoDownloader` tool. The binaries in this directory are automatically downloaded with the `MongoDownloader` tool.
In order to download the latest binary: In order to download the latest binary:
1. Go into the `Mongo2Go/src/MongoDownloader` directory 1. Go into the `Mongo2Go/src/MongoDownloader` directory
2. Run the downloader with `dotnet run` 2. Run the downloader with `dotnet run`
* The _MongoDB Community Server_ binaries are fetched from [https://s3.amazonaws.com/downloads.mongodb.org/current.json](https://s3.amazonaws.com/downloads.mongodb.org/current.json) * The _MongoDB Community Server_ binaries are fetched from [https://s3.amazonaws.com/downloads.mongodb.org/current.json](https://s3.amazonaws.com/downloads.mongodb.org/current.json)
The latest production version is downloaded and extracted. The latest production version is downloaded and extracted.
* The _MongoDB Database Tools_ archives are fetched from [https://s3.amazonaws.com/downloads.mongodb.org/tools/db/release.json](https://s3.amazonaws.com/downloads.mongodb.org/tools/db/release.json) * The _MongoDB Database Tools_ archives are fetched from [https://s3.amazonaws.com/downloads.mongodb.org/tools/db/release.json](https://s3.amazonaws.com/downloads.mongodb.org/tools/db/release.json)
The latest version is downloaded and extracted. The latest version is downloaded and extracted.

View File

@@ -1,373 +1,373 @@
Mozilla Public License Version 2.0 Mozilla Public License Version 2.0
================================== ==================================
1. Definitions 1. Definitions
-------------- --------------
1.1. "Contributor" 1.1. "Contributor"
means each individual or legal entity that creates, contributes to means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software. the creation of, or owns Covered Software.
1.2. "Contributor Version" 1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution. by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution" 1.3. "Contribution"
means Covered Software of a particular Contributor. means Covered Software of a particular Contributor.
1.4. "Covered Software" 1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case Form, and Modifications of such Source Code Form, in each case
including portions thereof. including portions thereof.
1.5. "Incompatible With Secondary Licenses" 1.5. "Incompatible With Secondary Licenses"
means means
(a) that the initial Contributor has attached the notice described (a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of (b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the version 1.1 or earlier of the License, but not also under the
terms of a Secondary License. terms of a Secondary License.
1.6. "Executable Form" 1.6. "Executable Form"
means any form of the work other than Source Code Form. means any form of the work other than Source Code Form.
1.7. "Larger Work" 1.7. "Larger Work"
means a work that combines Covered Software with other material, in means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software. a separate file or files, that is not Covered Software.
1.8. "License" 1.8. "License"
means this document. means this document.
1.9. "Licensable" 1.9. "Licensable"
means having the right to grant, to the maximum extent possible, means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License. all of the rights conveyed by this License.
1.10. "Modifications" 1.10. "Modifications"
means any of the following: means any of the following:
(a) any file in Source Code Form that results from an addition to, (a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered deletion from, or modification of the contents of Covered
Software; or Software; or
(b) any new file in Source Code Form that contains any Covered (b) any new file in Source Code Form that contains any Covered
Software. Software.
1.11. "Patent Claims" of a Contributor 1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method, means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its made, import, or transfer of either its Contributions or its
Contributor Version. Contributor Version.
1.12. "Secondary License" 1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those Public License, Version 3.0, or any later versions of those
licenses. licenses.
1.13. "Source Code Form" 1.13. "Source Code Form"
means the form of the work preferred for making modifications. means the form of the work preferred for making modifications.
1.14. "You" (or "Your") 1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity, or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity. ownership of such entity.
2. License Grants and Conditions 2. License Grants and Conditions
-------------------------------- --------------------------------
2.1. Grants 2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free, Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license: non-exclusive license:
(a) under intellectual property rights (other than patent or trademark) (a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available, Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer (b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version. Contributions or its Contributor Version.
2.2. Effective Date 2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first become effective for each Contribution on the date the Contributor first
distributes such Contribution. distributes such Contribution.
2.3. Limitations on Grant Scope 2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License. distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor: Contributor:
(a) for any code that a Contributor has removed from Covered Software; (a) for any code that a Contributor has removed from Covered Software;
or or
(b) for infringements caused by: (i) Your and any other third party's (b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor Contributions with other software (except as part of its Contributor
Version); or Version); or
(c) under Patent Claims infringed by Covered Software in the absence of (c) under Patent Claims infringed by Covered Software in the absence of
its Contributions. its Contributions.
This License does not grant any rights in the trademarks, service marks, This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4). the notice requirements in Section 3.4).
2.4. Subsequent Licenses 2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3). permitted under the terms of Section 3.3).
2.5. Representation 2.5. Representation
Each Contributor represents that the Contributor believes its Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License. to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use 2.6. Fair Use
This License is not intended to limit any rights You have under This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other applicable copyright doctrines of fair use, fair dealing, or other
equivalents. equivalents.
2.7. Conditions 2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1. in Section 2.1.
3. Responsibilities 3. Responsibilities
------------------- -------------------
3.1. Distribution of Source Form 3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code attempt to alter or restrict the recipients' rights in the Source Code
Form. Form.
3.2. Distribution of Executable Form 3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then: If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code (a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this (b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License. the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work 3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice, You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary Software under the terms of either this License or such Secondary
License(s). License(s).
3.4. Notices 3.4. Notices
You may not remove or alter the substance of any license notices You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, (including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies. the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms 3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support, You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support, liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any disclaimers of warranty and limitations of liability specific to any
jurisdiction. jurisdiction.
4. Inability to Comply Due to Statute or Regulation 4. Inability to Comply Due to Statute or Regulation
--------------------------------------------------- ---------------------------------------------------
If it is impossible for You to comply with any of the terms of this If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b) the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it. recipient of ordinary skill to be able to understand it.
5. Termination 5. Termination
-------------- --------------
5.1. The rights granted under this License will terminate automatically 5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice. Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent 5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions, infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate. 2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License have been validly granted by You or Your distributors under this License
prior to termination shall survive termination. prior to termination shall survive termination.
************************************************************************ ************************************************************************
* * * *
* 6. Disclaimer of Warranty * * 6. Disclaimer of Warranty *
* ------------------------- * * ------------------------- *
* * * *
* Covered Software is provided under this License on an "as is" * * Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or * * basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the * * statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a * * Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the * * particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. * * quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You * * Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, * * (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an * * repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is * * essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. * * authorized under this License except under this disclaimer. *
* * * *
************************************************************************ ************************************************************************
************************************************************************ ************************************************************************
* * * *
* 7. Limitation of Liability * * 7. Limitation of Liability *
* -------------------------- * * -------------------------- *
* * * *
* Under no circumstances and under no legal theory, whether tort * * Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any * * (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as * * Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, * * permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character * * special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of * * including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any * * goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party * * and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This * * shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or * * limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the * * personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some * * extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of * * jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and * * incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. * * limitation may not apply to You. *
* * * *
************************************************************************ ************************************************************************
8. Litigation 8. Litigation
------------- -------------
Any litigation relating to this License may be brought only in the Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims. cross-claims or counter-claims.
9. Miscellaneous 9. Miscellaneous
---------------- ----------------
This License represents the complete agreement concerning the subject This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor. shall not be used to construe this License against a Contributor.
10. Versions of the License 10. Versions of the License
--------------------------- ---------------------------
10.1. New Versions 10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or 10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a publish new versions of this License. Each version will be given a
distinguishing version number. distinguishing version number.
10.2. Effect of New Versions 10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software, of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license or under the terms of any subsequent version published by the license
steward. steward.
10.3. Modified Versions 10.3. Modified Versions
If you create software not governed by this License, and you want to If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that any references to the name of the license steward (except to note that
such modified license differs from this License). such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary 10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses Licenses
If You choose to distribute Source Code Form that is Incompatible With If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached. notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice Exhibit A - Source Code Form License Notice
------------------------------------------- -------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look file in a relevant directory) where a recipient would be likely to look
for such a notice. for such a notice.
You may add additional accurate notices of copyright ownership. You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice Exhibit B - "Incompatible With Secondary Licenses" Notice
--------------------------------------------------------- ---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0. defined by the Mozilla Public License, v. 2.0.

View File

@@ -1,87 +1,87 @@
MongoDB README MongoDB README
Welcome to MongoDB! Welcome to MongoDB!
COMPONENTS COMPONENTS
mongod - The database server. mongod - The database server.
mongos - Sharding router. mongos - Sharding router.
mongo - The database shell (uses interactive javascript). mongo - The database shell (uses interactive javascript).
UTILITIES UTILITIES
install_compass - Installs MongoDB Compass for your platform. install_compass - Installs MongoDB Compass for your platform.
BUILDING BUILDING
See docs/building.md. See docs/building.md.
RUNNING RUNNING
For command line options invoke: For command line options invoke:
$ ./mongod --help $ ./mongod --help
To run a single server database: To run a single server database:
$ sudo mkdir -p /data/db $ sudo mkdir -p /data/db
$ ./mongod $ ./mongod
$ $
$ # The mongo javascript shell connects to localhost and test database by default: $ # The mongo javascript shell connects to localhost and test database by default:
$ ./mongo $ ./mongo
> help > help
INSTALLING COMPASS INSTALLING COMPASS
You can install compass using the install_compass script packaged with MongoDB: You can install compass using the install_compass script packaged with MongoDB:
$ ./install_compass $ ./install_compass
This will download the appropriate MongoDB Compass package for your platform This will download the appropriate MongoDB Compass package for your platform
and install it. and install it.
DRIVERS DRIVERS
Client drivers for most programming languages are available at Client drivers for most programming languages are available at
https://docs.mongodb.com/manual/applications/drivers/. Use the shell https://docs.mongodb.com/manual/applications/drivers/. Use the shell
("mongo") for administrative tasks. ("mongo") for administrative tasks.
BUG REPORTS BUG REPORTS
See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports. See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports.
PACKAGING PACKAGING
Packages are created dynamically by the package.py script located in the Packages are created dynamically by the package.py script located in the
buildscripts directory. This will generate RPM and Debian packages. buildscripts directory. This will generate RPM and Debian packages.
DOCUMENTATION DOCUMENTATION
https://docs.mongodb.com/manual/ https://docs.mongodb.com/manual/
CLOUD HOSTED MONGODB CLOUD HOSTED MONGODB
https://www.mongodb.com/cloud/atlas https://www.mongodb.com/cloud/atlas
FORUMS FORUMS
https://community.mongodb.com https://community.mongodb.com
A forum for technical questions about using MongoDB. A forum for technical questions about using MongoDB.
https://community.mongodb.com/c/server-dev https://community.mongodb.com/c/server-dev
A forum for technical questions about building and developing MongoDB. A forum for technical questions about building and developing MongoDB.
LEARN MONGODB LEARN MONGODB
https://university.mongodb.com/ https://university.mongodb.com/
LICENSE LICENSE
MongoDB is free and open-source. Versions released prior to October 16, MongoDB is free and open-source. Versions released prior to October 16,
2018 are published under the AGPL. All versions released after October 2018 are published under the AGPL. All versions released after October
16, 2018, including patch fixes for prior versions, are published under 16, 2018, including patch fixes for prior versions, are published under
the Server Side Public License (SSPL) v1. See individual files for the Server Side Public License (SSPL) v1. See individual files for
details. details.

View File

@@ -1,13 +1,13 @@
Copyright 2014 MongoDB, Inc. Copyright 2014 MongoDB, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@@ -1,72 +1,72 @@
MongoDB Tools MongoDB Tools
=================================== ===================================
- **bsondump** - _display BSON files in a human-readable format_ - **bsondump** - _display BSON files in a human-readable format_
- **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_ - **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_
- **mongoexport** - _Write an existing collection to CSV or JSON format_ - **mongoexport** - _Write an existing collection to CSV or JSON format_
- **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_ - **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_
- **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_ - **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_
- **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_ - **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_
- **mongotop** - _Monitor read/write activity on a mongo server_ - **mongotop** - _Monitor read/write activity on a mongo server_
Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS
Building Tools Building Tools
--------------- ---------------
We currently build the tools with Go version 1.15. Other Go versions may work but they are untested. We currently build the tools with Go version 1.15. Other Go versions may work but they are untested.
Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository: Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository:
``` ```
git clone https://github.com/mongodb/mongo-tools git clone https://github.com/mongodb/mongo-tools
cd mongo-tools cd mongo-tools
``` ```
Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository. Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository.
You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`. You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`.
To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go. To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go.
``` ```
export GOROOT=/usr/local/go export GOROOT=/usr/local/go
``` ```
Updating Dependencies Updating Dependencies
--------------- ---------------
Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory. Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory.
In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory: In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory:
``` ```
go mod edit -require=<package>@<version> # for adding or updating a dependency go mod edit -require=<package>@<version> # for adding or updating a dependency
go mod edit -droprequire=<package> # for removing a dependency go mod edit -droprequire=<package> # for removing a dependency
``` ```
Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file. Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file.
Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code. Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code.
Contributing Contributing
--------------- ---------------
See our [Contributor's Guide](CONTRIBUTING.md). See our [Contributor's Guide](CONTRIBUTING.md).
Documentation Documentation
--------------- ---------------
See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/). See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/).
For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual): For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual):
- [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program) - [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program)
- [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program) - [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program)
- [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program) - [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program)
Adding New Platforms Support Adding New Platforms Support
--------------- ---------------
See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md). See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md).
Vendoring the Change into Server Repo Vendoring the Change into Server Repo
--------------- ---------------
See our [Vendor the Change into Server Repo](SERVERVENDORING.md). See our [Vendor the Change into Server Repo](SERVERVENDORING.md).

View File

@@ -1,373 +1,373 @@
Mozilla Public License Version 2.0 Mozilla Public License Version 2.0
================================== ==================================
1. Definitions 1. Definitions
-------------- --------------
1.1. "Contributor" 1.1. "Contributor"
means each individual or legal entity that creates, contributes to means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software. the creation of, or owns Covered Software.
1.2. "Contributor Version" 1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution. by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution" 1.3. "Contribution"
means Covered Software of a particular Contributor. means Covered Software of a particular Contributor.
1.4. "Covered Software" 1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case Form, and Modifications of such Source Code Form, in each case
including portions thereof. including portions thereof.
1.5. "Incompatible With Secondary Licenses" 1.5. "Incompatible With Secondary Licenses"
means means
(a) that the initial Contributor has attached the notice described (a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of (b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the version 1.1 or earlier of the License, but not also under the
terms of a Secondary License. terms of a Secondary License.
1.6. "Executable Form" 1.6. "Executable Form"
means any form of the work other than Source Code Form. means any form of the work other than Source Code Form.
1.7. "Larger Work" 1.7. "Larger Work"
means a work that combines Covered Software with other material, in means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software. a separate file or files, that is not Covered Software.
1.8. "License" 1.8. "License"
means this document. means this document.
1.9. "Licensable" 1.9. "Licensable"
means having the right to grant, to the maximum extent possible, means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License. all of the rights conveyed by this License.
1.10. "Modifications" 1.10. "Modifications"
means any of the following: means any of the following:
(a) any file in Source Code Form that results from an addition to, (a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered deletion from, or modification of the contents of Covered
Software; or Software; or
(b) any new file in Source Code Form that contains any Covered (b) any new file in Source Code Form that contains any Covered
Software. Software.
1.11. "Patent Claims" of a Contributor 1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method, means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its made, import, or transfer of either its Contributions or its
Contributor Version. Contributor Version.
1.12. "Secondary License" 1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those Public License, Version 3.0, or any later versions of those
licenses. licenses.
1.13. "Source Code Form" 1.13. "Source Code Form"
means the form of the work preferred for making modifications. means the form of the work preferred for making modifications.
1.14. "You" (or "Your") 1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity, or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity. ownership of such entity.
2. License Grants and Conditions 2. License Grants and Conditions
-------------------------------- --------------------------------
2.1. Grants 2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free, Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license: non-exclusive license:
(a) under intellectual property rights (other than patent or trademark) (a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available, Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer (b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version. Contributions or its Contributor Version.
2.2. Effective Date 2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first become effective for each Contribution on the date the Contributor first
distributes such Contribution. distributes such Contribution.
2.3. Limitations on Grant Scope 2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License. distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor: Contributor:
(a) for any code that a Contributor has removed from Covered Software; (a) for any code that a Contributor has removed from Covered Software;
or or
(b) for infringements caused by: (i) Your and any other third party's (b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor Contributions with other software (except as part of its Contributor
Version); or Version); or
(c) under Patent Claims infringed by Covered Software in the absence of (c) under Patent Claims infringed by Covered Software in the absence of
its Contributions. its Contributions.
This License does not grant any rights in the trademarks, service marks, This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4). the notice requirements in Section 3.4).
2.4. Subsequent Licenses 2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3). permitted under the terms of Section 3.3).
2.5. Representation 2.5. Representation
Each Contributor represents that the Contributor believes its Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License. to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use 2.6. Fair Use
This License is not intended to limit any rights You have under This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other applicable copyright doctrines of fair use, fair dealing, or other
equivalents. equivalents.
2.7. Conditions 2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1. in Section 2.1.
3. Responsibilities 3. Responsibilities
------------------- -------------------
3.1. Distribution of Source Form 3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code attempt to alter or restrict the recipients' rights in the Source Code
Form. Form.
3.2. Distribution of Executable Form 3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then: If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code (a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this (b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License. the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work 3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice, You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary Software under the terms of either this License or such Secondary
License(s). License(s).
3.4. Notices 3.4. Notices
You may not remove or alter the substance of any license notices You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, (including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies. the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms 3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support, You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support, liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any disclaimers of warranty and limitations of liability specific to any
jurisdiction. jurisdiction.
4. Inability to Comply Due to Statute or Regulation 4. Inability to Comply Due to Statute or Regulation
--------------------------------------------------- ---------------------------------------------------
If it is impossible for You to comply with any of the terms of this If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b) the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it. recipient of ordinary skill to be able to understand it.
5. Termination 5. Termination
-------------- --------------
5.1. The rights granted under this License will terminate automatically 5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice. Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent 5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions, infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate. 2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License have been validly granted by You or Your distributors under this License
prior to termination shall survive termination. prior to termination shall survive termination.
************************************************************************ ************************************************************************
* * * *
* 6. Disclaimer of Warranty * * 6. Disclaimer of Warranty *
* ------------------------- * * ------------------------- *
* * * *
* Covered Software is provided under this License on an "as is" * * Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or * * basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the * * statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a * * Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the * * particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. * * quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You * * Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, * * (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an * * repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is * * essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. * * authorized under this License except under this disclaimer. *
* * * *
************************************************************************ ************************************************************************
************************************************************************ ************************************************************************
* * * *
* 7. Limitation of Liability * * 7. Limitation of Liability *
* -------------------------- * * -------------------------- *
* * * *
* Under no circumstances and under no legal theory, whether tort * * Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any * * (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as * * Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, * * permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character * * special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of * * including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any * * goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party * * and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This * * shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or * * limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the * * personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some * * extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of * * jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and * * incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. * * limitation may not apply to You. *
* * * *
************************************************************************ ************************************************************************
8. Litigation 8. Litigation
------------- -------------
Any litigation relating to this License may be brought only in the Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims. cross-claims or counter-claims.
9. Miscellaneous 9. Miscellaneous
---------------- ----------------
This License represents the complete agreement concerning the subject This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor. shall not be used to construe this License against a Contributor.
10. Versions of the License 10. Versions of the License
--------------------------- ---------------------------
10.1. New Versions 10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or 10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a publish new versions of this License. Each version will be given a
distinguishing version number. distinguishing version number.
10.2. Effect of New Versions 10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software, of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license or under the terms of any subsequent version published by the license
steward. steward.
10.3. Modified Versions 10.3. Modified Versions
If you create software not governed by this License, and you want to If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that any references to the name of the license steward (except to note that
such modified license differs from this License). such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary 10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses Licenses
If You choose to distribute Source Code Form that is Incompatible With If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached. notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice Exhibit A - Source Code Form License Notice
------------------------------------------- -------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look file in a relevant directory) where a recipient would be likely to look
for such a notice. for such a notice.
You may add additional accurate notices of copyright ownership. You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice Exhibit B - "Incompatible With Secondary Licenses" Notice
--------------------------------------------------------- ---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0. defined by the Mozilla Public License, v. 2.0.

View File

@@ -1,87 +1,87 @@
MongoDB README MongoDB README
Welcome to MongoDB! Welcome to MongoDB!
COMPONENTS COMPONENTS
mongod - The database server. mongod - The database server.
mongos - Sharding router. mongos - Sharding router.
mongo - The database shell (uses interactive javascript). mongo - The database shell (uses interactive javascript).
UTILITIES UTILITIES
install_compass - Installs MongoDB Compass for your platform. install_compass - Installs MongoDB Compass for your platform.
BUILDING BUILDING
See docs/building.md. See docs/building.md.
RUNNING RUNNING
For command line options invoke: For command line options invoke:
$ ./mongod --help $ ./mongod --help
To run a single server database: To run a single server database:
$ sudo mkdir -p /data/db $ sudo mkdir -p /data/db
$ ./mongod $ ./mongod
$ $
$ # The mongo javascript shell connects to localhost and test database by default: $ # The mongo javascript shell connects to localhost and test database by default:
$ ./mongo $ ./mongo
> help > help
INSTALLING COMPASS INSTALLING COMPASS
You can install compass using the install_compass script packaged with MongoDB: You can install compass using the install_compass script packaged with MongoDB:
$ ./install_compass $ ./install_compass
This will download the appropriate MongoDB Compass package for your platform This will download the appropriate MongoDB Compass package for your platform
and install it. and install it.
DRIVERS DRIVERS
Client drivers for most programming languages are available at Client drivers for most programming languages are available at
https://docs.mongodb.com/manual/applications/drivers/. Use the shell https://docs.mongodb.com/manual/applications/drivers/. Use the shell
("mongo") for administrative tasks. ("mongo") for administrative tasks.
BUG REPORTS BUG REPORTS
See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports. See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports.
PACKAGING PACKAGING
Packages are created dynamically by the package.py script located in the Packages are created dynamically by the package.py script located in the
buildscripts directory. This will generate RPM and Debian packages. buildscripts directory. This will generate RPM and Debian packages.
DOCUMENTATION DOCUMENTATION
https://docs.mongodb.com/manual/ https://docs.mongodb.com/manual/
CLOUD HOSTED MONGODB CLOUD HOSTED MONGODB
https://www.mongodb.com/cloud/atlas https://www.mongodb.com/cloud/atlas
FORUMS FORUMS
https://community.mongodb.com https://community.mongodb.com
A forum for technical questions about using MongoDB. A forum for technical questions about using MongoDB.
https://community.mongodb.com/c/server-dev https://community.mongodb.com/c/server-dev
A forum for technical questions about building and developing MongoDB. A forum for technical questions about building and developing MongoDB.
LEARN MONGODB LEARN MONGODB
https://university.mongodb.com/ https://university.mongodb.com/
LICENSE LICENSE
MongoDB is free and open-source. Versions released prior to October 16, MongoDB is free and open-source. Versions released prior to October 16,
2018 are published under the AGPL. All versions released after October 2018 are published under the AGPL. All versions released after October
16, 2018, including patch fixes for prior versions, are published under 16, 2018, including patch fixes for prior versions, are published under
the Server Side Public License (SSPL) v1. See individual files for the Server Side Public License (SSPL) v1. See individual files for
details. details.

View File

@@ -1,13 +1,13 @@
Copyright 2014 MongoDB, Inc. Copyright 2014 MongoDB, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@@ -1,72 +1,72 @@
MongoDB Tools MongoDB Tools
=================================== ===================================
- **bsondump** - _display BSON files in a human-readable format_ - **bsondump** - _display BSON files in a human-readable format_
- **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_ - **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_
- **mongoexport** - _Write an existing collection to CSV or JSON format_ - **mongoexport** - _Write an existing collection to CSV or JSON format_
- **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_ - **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_
- **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_ - **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_
- **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_ - **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_
- **mongotop** - _Monitor read/write activity on a mongo server_ - **mongotop** - _Monitor read/write activity on a mongo server_
Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS
Building Tools Building Tools
--------------- ---------------
We currently build the tools with Go version 1.15. Other Go versions may work but they are untested. We currently build the tools with Go version 1.15. Other Go versions may work but they are untested.
Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository: Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository:
``` ```
git clone https://github.com/mongodb/mongo-tools git clone https://github.com/mongodb/mongo-tools
cd mongo-tools cd mongo-tools
``` ```
Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository. Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository.
You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`. You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`.
To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go. To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go.
``` ```
export GOROOT=/usr/local/go export GOROOT=/usr/local/go
``` ```
Updating Dependencies Updating Dependencies
--------------- ---------------
Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory. Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory.
In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory: In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory:
``` ```
go mod edit -require=<package>@<version> # for adding or updating a dependency go mod edit -require=<package>@<version> # for adding or updating a dependency
go mod edit -droprequire=<package> # for removing a dependency go mod edit -droprequire=<package> # for removing a dependency
``` ```
Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file. Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file.
Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code. Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code.
Contributing Contributing
--------------- ---------------
See our [Contributor's Guide](CONTRIBUTING.md). See our [Contributor's Guide](CONTRIBUTING.md).
Documentation Documentation
--------------- ---------------
See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/). See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/).
For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual): For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual):
- [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program) - [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program)
- [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program) - [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program)
- [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program) - [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program)
Adding New Platforms Support Adding New Platforms Support
--------------- ---------------
See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md). See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md).
Vendoring the Change into Server Repo Vendoring the Change into Server Repo
--------------- ---------------
See our [Vendor the Change into Server Repo](SERVERVENDORING.md). See our [Vendor the Change into Server Repo](SERVERVENDORING.md).

View File

@@ -1,46 +1,46 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata> <metadata>
<id>Mongo2Go</id> <id>Mongo2Go</id>
<version>4.1.0</version> <version>4.1.0</version>
<authors>Johannes Hoppe and many contributors</authors> <authors>Johannes Hoppe and many contributors</authors>
<license type="expression">MIT</license> <license type="expression">MIT</license>
<licenseUrl>https://licenses.nuget.org/MIT</licenseUrl> <licenseUrl>https://licenses.nuget.org/MIT</licenseUrl>
<icon>icon.png</icon> <icon>icon.png</icon>
<projectUrl>https://github.com/Mongo2Go/Mongo2Go</projectUrl> <projectUrl>https://github.com/Mongo2Go/Mongo2Go</projectUrl>
<description>Mongo2Go is a managed wrapper around MongoDB binaries. It targets .NET Framework 4.7.2 and .NET Standard 2.1. <description>Mongo2Go is a managed wrapper around MongoDB binaries. It targets .NET Framework 4.7.2 and .NET Standard 2.1.
This Nuget package contains the executables of mongod, mongoimport and mongoexport v4.4.4 for Windows, Linux and macOS. This Nuget package contains the executables of mongod, mongoimport and mongoexport v4.4.4 for Windows, Linux and macOS.
Mongo2Go has two use cases: Mongo2Go has two use cases:
1. Providing multiple, temporary and isolated MongoDB databases for integration tests 1. Providing multiple, temporary and isolated MongoDB databases for integration tests
2. Providing a quick to set up MongoDB database for a local developer environment</description> 2. Providing a quick to set up MongoDB database for a local developer environment</description>
<releaseNotes>https://github.com/Mongo2Go/Mongo2Go/releases</releaseNotes> <releaseNotes>https://github.com/Mongo2Go/Mongo2Go/releases</releaseNotes>
<copyright>Copyright © 2012-2025 Johannes Hoppe and many ❤️ contributors</copyright> <copyright>Copyright © 2012-2025 Johannes Hoppe and many ❤️ contributors</copyright>
<tags>MongoDB Mongo unit test integration runner</tags> <tags>MongoDB Mongo unit test integration runner</tags>
<repository type="git" url="https://github.com/Mongo2Go/Mongo2Go" commit="af7bef70382f1a07b89470b7cdafb9b7f6a63bc2" /> <repository type="git" url="https://github.com/Mongo2Go/Mongo2Go" commit="af7bef70382f1a07b89470b7cdafb9b7f6a63bc2" />
<dependencies> <dependencies>
<group targetFramework=".NETFramework4.7.2"> <group targetFramework=".NETFramework4.7.2">
<dependency id="Microsoft.Extensions.Logging.Abstractions" version="6.0.0" exclude="Build,Analyzers" /> <dependency id="Microsoft.Extensions.Logging.Abstractions" version="6.0.0" exclude="Build,Analyzers" />
<dependency id="MongoDB.Driver" version="3.1.0" exclude="Build,Analyzers" /> <dependency id="MongoDB.Driver" version="3.1.0" exclude="Build,Analyzers" />
<dependency id="System.Text.Json" version="6.0.10" exclude="Build,Analyzers" /> <dependency id="System.Text.Json" version="6.0.10" exclude="Build,Analyzers" />
</group> </group>
<group targetFramework=".NETStandard2.1"> <group targetFramework=".NETStandard2.1">
<dependency id="Microsoft.Extensions.Logging.Abstractions" version="6.0.0" exclude="Build,Analyzers" /> <dependency id="Microsoft.Extensions.Logging.Abstractions" version="6.0.0" exclude="Build,Analyzers" />
<dependency id="MongoDB.Driver" version="3.1.0" exclude="Build,Analyzers" /> <dependency id="MongoDB.Driver" version="3.1.0" exclude="Build,Analyzers" />
<dependency id="System.Text.Json" version="6.0.10" exclude="Build,Analyzers" /> <dependency id="System.Text.Json" version="6.0.10" exclude="Build,Analyzers" />
</group> </group>
</dependencies> </dependencies>
<frameworkAssemblies> <frameworkAssemblies>
<frameworkAssembly assemblyName="System.IO" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.IO" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Net.Http" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Net.Http" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Runtime" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Runtime" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Runtime.InteropServices.RuntimeInformation" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Runtime.InteropServices.RuntimeInformation" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Security.Cryptography.Algorithms" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Security.Cryptography.Algorithms" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Security.Cryptography.Encoding" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Security.Cryptography.Encoding" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Security.Cryptography.Primitives" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Security.Cryptography.Primitives" targetFramework=".NETFramework4.7.2" />
<frameworkAssembly assemblyName="System.Security.Cryptography.X509Certificates" targetFramework=".NETFramework4.7.2" /> <frameworkAssembly assemblyName="System.Security.Cryptography.X509Certificates" targetFramework=".NETFramework4.7.2" />
</frameworkAssemblies> </frameworkAssemblies>
</metadata> </metadata>
</package> </package>

View File

@@ -1,30 +1,30 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" /> <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
<Default Extension="psmdcp" ContentType="application/vnd.openxmlformats-package.core-properties+xml" /> <Default Extension="psmdcp" ContentType="application/vnd.openxmlformats-package.core-properties+xml" />
<Default Extension="dll" ContentType="application/octet" /> <Default Extension="dll" ContentType="application/octet" />
<Default Extension="xml" ContentType="application/octet" /> <Default Extension="xml" ContentType="application/octet" />
<Default Extension="png" ContentType="application/octet" /> <Default Extension="png" ContentType="application/octet" />
<Default Extension="txt" ContentType="application/octet" /> <Default Extension="txt" ContentType="application/octet" />
<Default Extension="md" ContentType="application/octet" /> <Default Extension="md" ContentType="application/octet" />
<Default Extension="exe" ContentType="application/octet" /> <Default Extension="exe" ContentType="application/octet" />
<Default Extension="nuspec" ContentType="application/octet" /> <Default Extension="nuspec" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/bin/mongod" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/bin/mongod" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/bin/mongoexport" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/bin/mongoexport" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/bin/mongoimport" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/bin/mongoimport" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/community-server/MPL-2" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/community-server/MPL-2" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/community-server/README" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/community-server/README" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/community-server/THIRD-PARTY-NOTICES" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/community-server/THIRD-PARTY-NOTICES" ContentType="application/octet" />
<Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/database-tools/THIRD-PARTY-NOTICES" ContentType="application/octet" /> <Override PartName="/tools/mongodb-linux-4.4.4-database-tools-100.3.1/database-tools/THIRD-PARTY-NOTICES" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/bin/mongod" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/bin/mongod" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/bin/mongoexport" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/bin/mongoexport" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/bin/mongoimport" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/bin/mongoimport" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/community-server/MPL-2" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/community-server/MPL-2" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/community-server/README" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/community-server/README" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/community-server/THIRD-PARTY-NOTICES" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/community-server/THIRD-PARTY-NOTICES" ContentType="application/octet" />
<Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/database-tools/THIRD-PARTY-NOTICES" ContentType="application/octet" /> <Override PartName="/tools/mongodb-macos-4.4.4-database-tools-100.3.1/database-tools/THIRD-PARTY-NOTICES" ContentType="application/octet" />
<Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/community-server/MPL-2" ContentType="application/octet" /> <Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/community-server/MPL-2" ContentType="application/octet" />
<Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/community-server/README" ContentType="application/octet" /> <Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/community-server/README" ContentType="application/octet" />
<Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/community-server/THIRD-PARTY-NOTICES" ContentType="application/octet" /> <Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/community-server/THIRD-PARTY-NOTICES" ContentType="application/octet" />
<Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/database-tools/THIRD-PARTY-NOTICES" ContentType="application/octet" /> <Override PartName="/tools/mongodb-windows-4.4.4-database-tools-100.3.1/database-tools/THIRD-PARTY-NOTICES" ContentType="application/octet" />
</Types> </Types>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Type="http://schemas.microsoft.com/packaging/2010/07/manifest" Target="/Mongo2Go.nuspec" Id="R3B63D1B4D50A12A9" /> <Relationship Type="http://schemas.microsoft.com/packaging/2010/07/manifest" Target="/Mongo2Go.nuspec" Id="R3B63D1B4D50A12A9" />
<Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="/package/services/metadata/core-properties/002438390f9b42fb9cd0a8f5b12ea55f.psmdcp" Id="RBEDD0C0F360D4D91" /> <Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="/package/services/metadata/core-properties/002438390f9b42fb9cd0a8f5b12ea55f.psmdcp" Id="RBEDD0C0F360D4D91" />
</Relationships> </Relationships>

View File

@@ -1,175 +1,175 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<doc> <doc>
<assembly> <assembly>
<name>Mongo2Go</name> <name>Mongo2Go</name>
</assembly> </assembly>
<members> <members>
<member name="M:Mongo2Go.Helper.FolderSearch.FinalizePath(System.String)"> <member name="M:Mongo2Go.Helper.FolderSearch.FinalizePath(System.String)">
<summary> <summary>
Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.IPortPool.GetNextOpenPort"> <member name="M:Mongo2Go.Helper.IPortPool.GetNextOpenPort">
<summary> <summary>
Returns and reserves a new port Returns and reserves a new port
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongodArguments.GetValidAdditionalArguments(System.String,System.String)"> <member name="M:Mongo2Go.Helper.MongodArguments.GetValidAdditionalArguments(System.String,System.String)">
<summary> <summary>
Returns the <paramref name="additionalMongodArguments" /> if it is verified that it does not contain any mongod argument already defined by Mongo2Go. Returns the <paramref name="additionalMongodArguments" /> if it is verified that it does not contain any mongod argument already defined by Mongo2Go.
</summary> </summary>
<param name="existingMongodArguments">mongod arguments defined by Mongo2Go</param> <param name="existingMongodArguments">mongod arguments defined by Mongo2Go</param>
<param name="additionalMongodArguments">Additional mongod arguments</param> <param name="additionalMongodArguments">Additional mongod arguments</param>
<exception cref="T:System.ArgumentException"><paramref name="additionalMongodArguments" /> contains at least one mongod argument already defined by Mongo2Go</exception> <exception cref="T:System.ArgumentException"><paramref name="additionalMongodArguments" /> contains at least one mongod argument already defined by Mongo2Go</exception>
<returns>A string with the additional mongod arguments</returns> <returns>A string with the additional mongod arguments</returns>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Starts a new process. Process can be killed Starts a new process. Process can be killed
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Starts a new process. Starts a new process.
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoImportExport.Import(System.String,System.Int32,System.String,System.String,System.String,System.Boolean,System.String)"> <member name="M:Mongo2Go.Helper.MongoImportExport.Import(System.String,System.Int32,System.String,System.String,System.String,System.Boolean,System.String)">
<summary> <summary>
Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoImportExport.Export(System.String,System.Int32,System.String,System.String,System.String,System.String)"> <member name="M:Mongo2Go.Helper.MongoImportExport.Export(System.String,System.Int32,System.String,System.String,System.String,System.String)">
<summary> <summary>
Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
</summary> </summary>
</member> </member>
<member name="T:Mongo2Go.Helper.MongoLogStatement"> <member name="T:Mongo2Go.Helper.MongoLogStatement">
<summary> <summary>
Structure of a log generated by mongod. Used to deserialize the logs Structure of a log generated by mongod. Used to deserialize the logs
and pass them to an ILogger. and pass them to an ILogger.
See: https://docs.mongodb.com/manual/reference/log-messages/#json-log-output-format See: https://docs.mongodb.com/manual/reference/log-messages/#json-log-output-format
Note: "truncated" and "size" are not parsed as we're unsure how to Note: "truncated" and "size" are not parsed as we're unsure how to
properly parse and use them. properly parse and use them.
</summary> </summary>
</member> </member>
<member name="P:Mongo2Go.Helper.MongoLogStatement.Severity"> <member name="P:Mongo2Go.Helper.MongoLogStatement.Severity">
<summary> <summary>
Severity of the logs as defined by MongoDB. Mapped to LogLevel Severity of the logs as defined by MongoDB. Mapped to LogLevel
as defined by Microsoft. as defined by Microsoft.
D1-D2 mapped to Debug level. D3-D5 mapped Trace level. D1-D2 mapped to Debug level. D3-D5 mapped Trace level.
</summary> </summary>
</member> </member>
<member name="T:Mongo2Go.Helper.PortPool"> <member name="T:Mongo2Go.Helper.PortPool">
<summary> <summary>
Intention: port numbers won't be assigned twice to avoid connection problems with integration tests Intention: port numbers won't be assigned twice to avoid connection problems with integration tests
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.PortPool.GetNextOpenPort"> <member name="M:Mongo2Go.Helper.PortPool.GetNextOpenPort">
<summary> <summary>
Returns and reserves a new port Returns and reserves a new port
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.ProcessControl.StartAndWaitForReady(System.Diagnostics.Process,System.Int32,System.String,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.ProcessControl.StartAndWaitForReady(System.Diagnostics.Process,System.Int32,System.String,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Reads from Output stream to determine if process is ready Reads from Output stream to determine if process is ready
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToConsoleAndDebugOutput(System.Diagnostics.Process)"> <member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToConsoleAndDebugOutput(System.Diagnostics.Process)">
<summary> <summary>
Send the mongod process logs to .NET's console and debug outputs. Send the mongod process logs to .NET's console and debug outputs.
</summary> </summary>
<param name="process"></param> <param name="process"></param>
</member> </member>
<member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToLogger(System.Diagnostics.Process,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToLogger(System.Diagnostics.Process,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Parses and redirects mongod logs to ILogger. Parses and redirects mongod logs to ILogger.
</summary> </summary>
<param name="process"></param> <param name="process"></param>
<param name="logger"></param> <param name="logger"></param>
</member> </member>
<member name="T:Mongo2Go.Helper.StringFormatExtension"> <member name="T:Mongo2Go.Helper.StringFormatExtension">
<summary> <summary>
saves about 40 keystrokes saves about 40 keystrokes
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.Object[])"> <member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.Object[])">
<summary> <summary>
Populates the template using the provided arguments and the invariant culture Populates the template using the provided arguments and the invariant culture
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.IFormatProvider,System.Object[])"> <member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.IFormatProvider,System.Object[])">
<summary> <summary>
Populates the template using the provided arguments using the provided formatter Populates the template using the provided arguments using the provided formatter
</summary> </summary>
</member> </member>
<member name="T:Mongo2Go.MongoDbRunner"> <member name="T:Mongo2Go.MongoDbRunner">
<summary> <summary>
Mongo2Go main entry point Mongo2Go main entry point
</summary> </summary>
</member> </member>
<member name="P:Mongo2Go.MongoDbRunner.State"> <member name="P:Mongo2Go.MongoDbRunner.State">
<summary> <summary>
State of the current MongoDB instance State of the current MongoDB instance
</summary> </summary>
</member> </member>
<member name="P:Mongo2Go.MongoDbRunner.ConnectionString"> <member name="P:Mongo2Go.MongoDbRunner.ConnectionString">
<summary> <summary>
Connections string that should be used to establish a connection the MongoDB instance Connections string that should be used to establish a connection the MongoDB instance
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.Start(System.String,System.String,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.MongoDbRunner.Start(System.String,System.String,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Starts Multiple MongoDB instances with each call Starts Multiple MongoDB instances with each call
On dispose: kills them and deletes their data directory On dispose: kills them and deletes their data directory
</summary> </summary>
<param name="logger">(Optional) If null, mongod logs are wired to .NET's Console and Debug output (provided you haven't added the --quiet additional argument). <param name="logger">(Optional) If null, mongod logs are wired to .NET's Console and Debug output (provided you haven't added the --quiet additional argument).
If not null, mongod logs are parsed and wired to the provided logger.</param> If not null, mongod logs are parsed and wired to the provided logger.</param>
<remarks>Should be used for integration tests</remarks> <remarks>Should be used for integration tests</remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.StartUnitTest(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.StartUnitTest(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)">
<summary> <summary>
!!! !!!
This method is only used for an internal unit test. Use MongoDbRunner.Start() instead. This method is only used for an internal unit test. Use MongoDbRunner.Start() instead.
But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own! But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own!
</summary> </summary>
<remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks> <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.StartForDebugging(System.String,System.String,System.String,System.Boolean,System.Int32,System.String,System.UInt16)"> <member name="M:Mongo2Go.MongoDbRunner.StartForDebugging(System.String,System.String,System.String,System.Boolean,System.Int32,System.String,System.UInt16)">
<summary> <summary>
Only starts one single MongoDB instance (even on multiple calls), does not kill it, does not delete data Only starts one single MongoDB instance (even on multiple calls), does not kill it, does not delete data
</summary> </summary>
<remarks> <remarks>
Should be used for local debugging only Should be used for local debugging only
WARNING: one single instance on one single machine is not a suitable setup for productive environments!!! WARNING: one single instance on one single machine is not a suitable setup for productive environments!!!
</remarks> </remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.StartForDebuggingUnitTest(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.StartForDebuggingUnitTest(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)">
<summary> <summary>
!!! !!!
This method is only used for an internal unit test. Use MongoDbRunner.StartForDebugging() instead. This method is only used for an internal unit test. Use MongoDbRunner.StartForDebugging() instead.
But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own! But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own!
</summary> </summary>
<remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks> <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.Import(System.String,System.String,System.String,System.Boolean,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.Import(System.String,System.String,System.String,System.Boolean,System.String)">
<summary> <summary>
Executes Mongoimport on the associated MongoDB Instace Executes Mongoimport on the associated MongoDB Instace
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.Export(System.String,System.String,System.String,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.Export(System.String,System.String,System.String,System.String)">
<summary> <summary>
Executes Mongoexport on the associated MongoDB Instace Executes Mongoexport on the associated MongoDB Instace
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.Int32,System.String,System.Boolean,System.String,System.UInt16)"> <member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.Int32,System.String,System.Boolean,System.String,System.UInt16)">
<summary> <summary>
usage: local debugging usage: local debugging
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
usage: integration tests usage: integration tests
</summary> </summary>
</member> </member>
</members> </members>
</doc> </doc>

View File

@@ -1,175 +1,175 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<doc> <doc>
<assembly> <assembly>
<name>Mongo2Go</name> <name>Mongo2Go</name>
</assembly> </assembly>
<members> <members>
<member name="M:Mongo2Go.Helper.FolderSearch.FinalizePath(System.String)"> <member name="M:Mongo2Go.Helper.FolderSearch.FinalizePath(System.String)">
<summary> <summary>
Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.IPortPool.GetNextOpenPort"> <member name="M:Mongo2Go.Helper.IPortPool.GetNextOpenPort">
<summary> <summary>
Returns and reserves a new port Returns and reserves a new port
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongodArguments.GetValidAdditionalArguments(System.String,System.String)"> <member name="M:Mongo2Go.Helper.MongodArguments.GetValidAdditionalArguments(System.String,System.String)">
<summary> <summary>
Returns the <paramref name="additionalMongodArguments" /> if it is verified that it does not contain any mongod argument already defined by Mongo2Go. Returns the <paramref name="additionalMongodArguments" /> if it is verified that it does not contain any mongod argument already defined by Mongo2Go.
</summary> </summary>
<param name="existingMongodArguments">mongod arguments defined by Mongo2Go</param> <param name="existingMongodArguments">mongod arguments defined by Mongo2Go</param>
<param name="additionalMongodArguments">Additional mongod arguments</param> <param name="additionalMongodArguments">Additional mongod arguments</param>
<exception cref="T:System.ArgumentException"><paramref name="additionalMongodArguments" /> contains at least one mongod argument already defined by Mongo2Go</exception> <exception cref="T:System.ArgumentException"><paramref name="additionalMongodArguments" /> contains at least one mongod argument already defined by Mongo2Go</exception>
<returns>A string with the additional mongod arguments</returns> <returns>A string with the additional mongod arguments</returns>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Starts a new process. Process can be killed Starts a new process. Process can be killed
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.MongoDbProcessStarter.Start(System.String,System.String,System.Int32,System.Boolean,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Starts a new process. Starts a new process.
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoImportExport.Import(System.String,System.Int32,System.String,System.String,System.String,System.Boolean,System.String)"> <member name="M:Mongo2Go.Helper.MongoImportExport.Import(System.String,System.Int32,System.String,System.String,System.String,System.Boolean,System.String)">
<summary> <summary>
Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.MongoImportExport.Export(System.String,System.Int32,System.String,System.String,System.String,System.String)"> <member name="M:Mongo2Go.Helper.MongoImportExport.Export(System.String,System.Int32,System.String,System.String,System.String,System.String)">
<summary> <summary>
Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder)
</summary> </summary>
</member> </member>
<member name="T:Mongo2Go.Helper.MongoLogStatement"> <member name="T:Mongo2Go.Helper.MongoLogStatement">
<summary> <summary>
Structure of a log generated by mongod. Used to deserialize the logs Structure of a log generated by mongod. Used to deserialize the logs
and pass them to an ILogger. and pass them to an ILogger.
See: https://docs.mongodb.com/manual/reference/log-messages/#json-log-output-format See: https://docs.mongodb.com/manual/reference/log-messages/#json-log-output-format
Note: "truncated" and "size" are not parsed as we're unsure how to Note: "truncated" and "size" are not parsed as we're unsure how to
properly parse and use them. properly parse and use them.
</summary> </summary>
</member> </member>
<member name="P:Mongo2Go.Helper.MongoLogStatement.Severity"> <member name="P:Mongo2Go.Helper.MongoLogStatement.Severity">
<summary> <summary>
Severity of the logs as defined by MongoDB. Mapped to LogLevel Severity of the logs as defined by MongoDB. Mapped to LogLevel
as defined by Microsoft. as defined by Microsoft.
D1-D2 mapped to Debug level. D3-D5 mapped Trace level. D1-D2 mapped to Debug level. D3-D5 mapped Trace level.
</summary> </summary>
</member> </member>
<member name="T:Mongo2Go.Helper.PortPool"> <member name="T:Mongo2Go.Helper.PortPool">
<summary> <summary>
Intention: port numbers won't be assigned twice to avoid connection problems with integration tests Intention: port numbers won't be assigned twice to avoid connection problems with integration tests
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.PortPool.GetNextOpenPort"> <member name="M:Mongo2Go.Helper.PortPool.GetNextOpenPort">
<summary> <summary>
Returns and reserves a new port Returns and reserves a new port
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.ProcessControl.StartAndWaitForReady(System.Diagnostics.Process,System.Int32,System.String,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.ProcessControl.StartAndWaitForReady(System.Diagnostics.Process,System.Int32,System.String,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Reads from Output stream to determine if process is ready Reads from Output stream to determine if process is ready
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToConsoleAndDebugOutput(System.Diagnostics.Process)"> <member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToConsoleAndDebugOutput(System.Diagnostics.Process)">
<summary> <summary>
Send the mongod process logs to .NET's console and debug outputs. Send the mongod process logs to .NET's console and debug outputs.
</summary> </summary>
<param name="process"></param> <param name="process"></param>
</member> </member>
<member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToLogger(System.Diagnostics.Process,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.Helper.ProcessControl.WireLogsToLogger(System.Diagnostics.Process,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Parses and redirects mongod logs to ILogger. Parses and redirects mongod logs to ILogger.
</summary> </summary>
<param name="process"></param> <param name="process"></param>
<param name="logger"></param> <param name="logger"></param>
</member> </member>
<member name="T:Mongo2Go.Helper.StringFormatExtension"> <member name="T:Mongo2Go.Helper.StringFormatExtension">
<summary> <summary>
saves about 40 keystrokes saves about 40 keystrokes
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.Object[])"> <member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.Object[])">
<summary> <summary>
Populates the template using the provided arguments and the invariant culture Populates the template using the provided arguments and the invariant culture
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.IFormatProvider,System.Object[])"> <member name="M:Mongo2Go.Helper.StringFormatExtension.Formatted(System.String,System.IFormatProvider,System.Object[])">
<summary> <summary>
Populates the template using the provided arguments using the provided formatter Populates the template using the provided arguments using the provided formatter
</summary> </summary>
</member> </member>
<member name="T:Mongo2Go.MongoDbRunner"> <member name="T:Mongo2Go.MongoDbRunner">
<summary> <summary>
Mongo2Go main entry point Mongo2Go main entry point
</summary> </summary>
</member> </member>
<member name="P:Mongo2Go.MongoDbRunner.State"> <member name="P:Mongo2Go.MongoDbRunner.State">
<summary> <summary>
State of the current MongoDB instance State of the current MongoDB instance
</summary> </summary>
</member> </member>
<member name="P:Mongo2Go.MongoDbRunner.ConnectionString"> <member name="P:Mongo2Go.MongoDbRunner.ConnectionString">
<summary> <summary>
Connections string that should be used to establish a connection the MongoDB instance Connections string that should be used to establish a connection the MongoDB instance
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.Start(System.String,System.String,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.MongoDbRunner.Start(System.String,System.String,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
Starts Multiple MongoDB instances with each call Starts Multiple MongoDB instances with each call
On dispose: kills them and deletes their data directory On dispose: kills them and deletes their data directory
</summary> </summary>
<param name="logger">(Optional) If null, mongod logs are wired to .NET's Console and Debug output (provided you haven't added the --quiet additional argument). <param name="logger">(Optional) If null, mongod logs are wired to .NET's Console and Debug output (provided you haven't added the --quiet additional argument).
If not null, mongod logs are parsed and wired to the provided logger.</param> If not null, mongod logs are parsed and wired to the provided logger.</param>
<remarks>Should be used for integration tests</remarks> <remarks>Should be used for integration tests</remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.StartUnitTest(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.StartUnitTest(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)">
<summary> <summary>
!!! !!!
This method is only used for an internal unit test. Use MongoDbRunner.Start() instead. This method is only used for an internal unit test. Use MongoDbRunner.Start() instead.
But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own! But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own!
</summary> </summary>
<remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks> <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.StartForDebugging(System.String,System.String,System.String,System.Boolean,System.Int32,System.String,System.UInt16)"> <member name="M:Mongo2Go.MongoDbRunner.StartForDebugging(System.String,System.String,System.String,System.Boolean,System.Int32,System.String,System.UInt16)">
<summary> <summary>
Only starts one single MongoDB instance (even on multiple calls), does not kill it, does not delete data Only starts one single MongoDB instance (even on multiple calls), does not kill it, does not delete data
</summary> </summary>
<remarks> <remarks>
Should be used for local debugging only Should be used for local debugging only
WARNING: one single instance on one single machine is not a suitable setup for productive environments!!! WARNING: one single instance on one single machine is not a suitable setup for productive environments!!!
</remarks> </remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.StartForDebuggingUnitTest(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.StartForDebuggingUnitTest(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.String)">
<summary> <summary>
!!! !!!
This method is only used for an internal unit test. Use MongoDbRunner.StartForDebugging() instead. This method is only used for an internal unit test. Use MongoDbRunner.StartForDebugging() instead.
But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own! But if you find it to be useful (eg. to change every aspect on your own) feel free to implement the interfaces on your own!
</summary> </summary>
<remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks> <remarks>see https://github.com/Mongo2Go/Mongo2Go/issues/41 </remarks>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.Import(System.String,System.String,System.String,System.Boolean,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.Import(System.String,System.String,System.String,System.Boolean,System.String)">
<summary> <summary>
Executes Mongoimport on the associated MongoDB Instace Executes Mongoimport on the associated MongoDB Instace
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.Export(System.String,System.String,System.String,System.String)"> <member name="M:Mongo2Go.MongoDbRunner.Export(System.String,System.String,System.String,System.String)">
<summary> <summary>
Executes Mongoexport on the associated MongoDB Instace Executes Mongoexport on the associated MongoDB Instace
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.Int32,System.String,System.Boolean,System.String,System.UInt16)"> <member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IProcessWatcher,Mongo2Go.Helper.IPortWatcher,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.Int32,System.String,System.Boolean,System.String,System.UInt16)">
<summary> <summary>
usage: local debugging usage: local debugging
</summary> </summary>
</member> </member>
<member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)"> <member name="M:Mongo2Go.MongoDbRunner.#ctor(Mongo2Go.Helper.IPortPool,Mongo2Go.Helper.IFileSystem,Mongo2Go.Helper.IMongoDbProcessStarter,Mongo2Go.Helper.IMongoBinaryLocator,System.String,System.Boolean,System.String,System.UInt16,Microsoft.Extensions.Logging.ILogger)">
<summary> <summary>
usage: integration tests usage: integration tests
</summary> </summary>
</member> </member>
</members> </members>
</doc> </doc>

View File

@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<coreProperties xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"> <coreProperties xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.openxmlformats.org/package/2006/metadata/core-properties">
<dc:creator>Johannes Hoppe and many contributors</dc:creator> <dc:creator>Johannes Hoppe and many contributors</dc:creator>
<dc:description>Mongo2Go is a managed wrapper around MongoDB binaries. It targets .NET Framework 4.7.2 and .NET Standard 2.1. <dc:description>Mongo2Go is a managed wrapper around MongoDB binaries. It targets .NET Framework 4.7.2 and .NET Standard 2.1.
This Nuget package contains the executables of mongod, mongoimport and mongoexport v4.4.4 for Windows, Linux and macOS. This Nuget package contains the executables of mongod, mongoimport and mongoexport v4.4.4 for Windows, Linux and macOS.
Mongo2Go has two use cases: Mongo2Go has two use cases:
1. Providing multiple, temporary and isolated MongoDB databases for integration tests 1. Providing multiple, temporary and isolated MongoDB databases for integration tests
2. Providing a quick to set up MongoDB database for a local developer environment</dc:description> 2. Providing a quick to set up MongoDB database for a local developer environment</dc:description>
<dc:identifier>Mongo2Go</dc:identifier> <dc:identifier>Mongo2Go</dc:identifier>
<version>4.1.0</version> <version>4.1.0</version>
<keywords>MongoDB Mongo unit test integration runner</keywords> <keywords>MongoDB Mongo unit test integration runner</keywords>
<lastModifiedBy>NuGet.Build.Tasks.Pack, Version=6.11.1.2, Culture=neutral, PublicKeyToken=31bf3856ad364e35;.NET Standard 2.0</lastModifiedBy> <lastModifiedBy>NuGet.Build.Tasks.Pack, Version=6.11.1.2, Culture=neutral, PublicKeyToken=31bf3856ad364e35;.NET Standard 2.0</lastModifiedBy>
</coreProperties> </coreProperties>

View File

@@ -1,373 +1,373 @@
Mozilla Public License Version 2.0 Mozilla Public License Version 2.0
================================== ==================================
1. Definitions 1. Definitions
-------------- --------------
1.1. "Contributor" 1.1. "Contributor"
means each individual or legal entity that creates, contributes to means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software. the creation of, or owns Covered Software.
1.2. "Contributor Version" 1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution. by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution" 1.3. "Contribution"
means Covered Software of a particular Contributor. means Covered Software of a particular Contributor.
1.4. "Covered Software" 1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case Form, and Modifications of such Source Code Form, in each case
including portions thereof. including portions thereof.
1.5. "Incompatible With Secondary Licenses" 1.5. "Incompatible With Secondary Licenses"
means means
(a) that the initial Contributor has attached the notice described (a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of (b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the version 1.1 or earlier of the License, but not also under the
terms of a Secondary License. terms of a Secondary License.
1.6. "Executable Form" 1.6. "Executable Form"
means any form of the work other than Source Code Form. means any form of the work other than Source Code Form.
1.7. "Larger Work" 1.7. "Larger Work"
means a work that combines Covered Software with other material, in means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software. a separate file or files, that is not Covered Software.
1.8. "License" 1.8. "License"
means this document. means this document.
1.9. "Licensable" 1.9. "Licensable"
means having the right to grant, to the maximum extent possible, means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License. all of the rights conveyed by this License.
1.10. "Modifications" 1.10. "Modifications"
means any of the following: means any of the following:
(a) any file in Source Code Form that results from an addition to, (a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered deletion from, or modification of the contents of Covered
Software; or Software; or
(b) any new file in Source Code Form that contains any Covered (b) any new file in Source Code Form that contains any Covered
Software. Software.
1.11. "Patent Claims" of a Contributor 1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method, means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its made, import, or transfer of either its Contributions or its
Contributor Version. Contributor Version.
1.12. "Secondary License" 1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those Public License, Version 3.0, or any later versions of those
licenses. licenses.
1.13. "Source Code Form" 1.13. "Source Code Form"
means the form of the work preferred for making modifications. means the form of the work preferred for making modifications.
1.14. "You" (or "Your") 1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity, or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity. ownership of such entity.
2. License Grants and Conditions 2. License Grants and Conditions
-------------------------------- --------------------------------
2.1. Grants 2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free, Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license: non-exclusive license:
(a) under intellectual property rights (other than patent or trademark) (a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available, Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer (b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version. Contributions or its Contributor Version.
2.2. Effective Date 2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first become effective for each Contribution on the date the Contributor first
distributes such Contribution. distributes such Contribution.
2.3. Limitations on Grant Scope 2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License. distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor: Contributor:
(a) for any code that a Contributor has removed from Covered Software; (a) for any code that a Contributor has removed from Covered Software;
or or
(b) for infringements caused by: (i) Your and any other third party's (b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor Contributions with other software (except as part of its Contributor
Version); or Version); or
(c) under Patent Claims infringed by Covered Software in the absence of (c) under Patent Claims infringed by Covered Software in the absence of
its Contributions. its Contributions.
This License does not grant any rights in the trademarks, service marks, This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4). the notice requirements in Section 3.4).
2.4. Subsequent Licenses 2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3). permitted under the terms of Section 3.3).
2.5. Representation 2.5. Representation
Each Contributor represents that the Contributor believes its Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License. to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use 2.6. Fair Use
This License is not intended to limit any rights You have under This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other applicable copyright doctrines of fair use, fair dealing, or other
equivalents. equivalents.
2.7. Conditions 2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1. in Section 2.1.
3. Responsibilities 3. Responsibilities
------------------- -------------------
3.1. Distribution of Source Form 3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code attempt to alter or restrict the recipients' rights in the Source Code
Form. Form.
3.2. Distribution of Executable Form 3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then: If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code (a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this (b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License. the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work 3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice, You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary Software under the terms of either this License or such Secondary
License(s). License(s).
3.4. Notices 3.4. Notices
You may not remove or alter the substance of any license notices You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, (including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies. the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms 3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support, You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support, liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any disclaimers of warranty and limitations of liability specific to any
jurisdiction. jurisdiction.
4. Inability to Comply Due to Statute or Regulation 4. Inability to Comply Due to Statute or Regulation
--------------------------------------------------- ---------------------------------------------------
If it is impossible for You to comply with any of the terms of this If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b) the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it. recipient of ordinary skill to be able to understand it.
5. Termination 5. Termination
-------------- --------------
5.1. The rights granted under this License will terminate automatically 5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice. Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent 5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions, infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate. 2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License have been validly granted by You or Your distributors under this License
prior to termination shall survive termination. prior to termination shall survive termination.
************************************************************************ ************************************************************************
* * * *
* 6. Disclaimer of Warranty * * 6. Disclaimer of Warranty *
* ------------------------- * * ------------------------- *
* * * *
* Covered Software is provided under this License on an "as is" * * Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or * * basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the * * statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a * * Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the * * particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. * * quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You * * Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, * * (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an * * repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is * * essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. * * authorized under this License except under this disclaimer. *
* * * *
************************************************************************ ************************************************************************
************************************************************************ ************************************************************************
* * * *
* 7. Limitation of Liability * * 7. Limitation of Liability *
* -------------------------- * * -------------------------- *
* * * *
* Under no circumstances and under no legal theory, whether tort * * Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any * * (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as * * Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, * * permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character * * special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of * * including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any * * goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party * * and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This * * shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or * * limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the * * personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some * * extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of * * jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and * * incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. * * limitation may not apply to You. *
* * * *
************************************************************************ ************************************************************************
8. Litigation 8. Litigation
------------- -------------
Any litigation relating to this License may be brought only in the Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims. cross-claims or counter-claims.
9. Miscellaneous 9. Miscellaneous
---------------- ----------------
This License represents the complete agreement concerning the subject This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor. shall not be used to construe this License against a Contributor.
10. Versions of the License 10. Versions of the License
--------------------------- ---------------------------
10.1. New Versions 10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or 10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a publish new versions of this License. Each version will be given a
distinguishing version number. distinguishing version number.
10.2. Effect of New Versions 10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software, of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license or under the terms of any subsequent version published by the license
steward. steward.
10.3. Modified Versions 10.3. Modified Versions
If you create software not governed by this License, and you want to If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that any references to the name of the license steward (except to note that
such modified license differs from this License). such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary 10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses Licenses
If You choose to distribute Source Code Form that is Incompatible With If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached. notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice Exhibit A - Source Code Form License Notice
------------------------------------------- -------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look file in a relevant directory) where a recipient would be likely to look
for such a notice. for such a notice.
You may add additional accurate notices of copyright ownership. You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice Exhibit B - "Incompatible With Secondary Licenses" Notice
--------------------------------------------------------- ---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0. defined by the Mozilla Public License, v. 2.0.

View File

@@ -1,87 +1,87 @@
MongoDB README MongoDB README
Welcome to MongoDB! Welcome to MongoDB!
COMPONENTS COMPONENTS
mongod - The database server. mongod - The database server.
mongos - Sharding router. mongos - Sharding router.
mongo - The database shell (uses interactive javascript). mongo - The database shell (uses interactive javascript).
UTILITIES UTILITIES
install_compass - Installs MongoDB Compass for your platform. install_compass - Installs MongoDB Compass for your platform.
BUILDING BUILDING
See docs/building.md. See docs/building.md.
RUNNING RUNNING
For command line options invoke: For command line options invoke:
$ ./mongod --help $ ./mongod --help
To run a single server database: To run a single server database:
$ sudo mkdir -p /data/db $ sudo mkdir -p /data/db
$ ./mongod $ ./mongod
$ $
$ # The mongo javascript shell connects to localhost and test database by default: $ # The mongo javascript shell connects to localhost and test database by default:
$ ./mongo $ ./mongo
> help > help
INSTALLING COMPASS INSTALLING COMPASS
You can install compass using the install_compass script packaged with MongoDB: You can install compass using the install_compass script packaged with MongoDB:
$ ./install_compass $ ./install_compass
This will download the appropriate MongoDB Compass package for your platform This will download the appropriate MongoDB Compass package for your platform
and install it. and install it.
DRIVERS DRIVERS
Client drivers for most programming languages are available at Client drivers for most programming languages are available at
https://docs.mongodb.com/manual/applications/drivers/. Use the shell https://docs.mongodb.com/manual/applications/drivers/. Use the shell
("mongo") for administrative tasks. ("mongo") for administrative tasks.
BUG REPORTS BUG REPORTS
See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports. See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports.
PACKAGING PACKAGING
Packages are created dynamically by the package.py script located in the Packages are created dynamically by the package.py script located in the
buildscripts directory. This will generate RPM and Debian packages. buildscripts directory. This will generate RPM and Debian packages.
DOCUMENTATION DOCUMENTATION
https://docs.mongodb.com/manual/ https://docs.mongodb.com/manual/
CLOUD HOSTED MONGODB CLOUD HOSTED MONGODB
https://www.mongodb.com/cloud/atlas https://www.mongodb.com/cloud/atlas
FORUMS FORUMS
https://community.mongodb.com https://community.mongodb.com
A forum for technical questions about using MongoDB. A forum for technical questions about using MongoDB.
https://community.mongodb.com/c/server-dev https://community.mongodb.com/c/server-dev
A forum for technical questions about building and developing MongoDB. A forum for technical questions about building and developing MongoDB.
LEARN MONGODB LEARN MONGODB
https://university.mongodb.com/ https://university.mongodb.com/
LICENSE LICENSE
MongoDB is free and open-source. Versions released prior to October 16, MongoDB is free and open-source. Versions released prior to October 16,
2018 are published under the AGPL. All versions released after October 2018 are published under the AGPL. All versions released after October
16, 2018, including patch fixes for prior versions, are published under 16, 2018, including patch fixes for prior versions, are published under
the Server Side Public License (SSPL) v1. See individual files for the Server Side Public License (SSPL) v1. See individual files for
details. details.

View File

@@ -1,13 +1,13 @@
Copyright 2014 MongoDB, Inc. Copyright 2014 MongoDB, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@@ -1,72 +1,72 @@
MongoDB Tools MongoDB Tools
=================================== ===================================
- **bsondump** - _display BSON files in a human-readable format_ - **bsondump** - _display BSON files in a human-readable format_
- **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_ - **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_
- **mongoexport** - _Write an existing collection to CSV or JSON format_ - **mongoexport** - _Write an existing collection to CSV or JSON format_
- **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_ - **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_
- **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_ - **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_
- **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_ - **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_
- **mongotop** - _Monitor read/write activity on a mongo server_ - **mongotop** - _Monitor read/write activity on a mongo server_
Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS
Building Tools Building Tools
--------------- ---------------
We currently build the tools with Go version 1.15. Other Go versions may work but they are untested. We currently build the tools with Go version 1.15. Other Go versions may work but they are untested.
Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository: Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository:
``` ```
git clone https://github.com/mongodb/mongo-tools git clone https://github.com/mongodb/mongo-tools
cd mongo-tools cd mongo-tools
``` ```
Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository. Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository.
You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`. You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`.
To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go. To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go.
``` ```
export GOROOT=/usr/local/go export GOROOT=/usr/local/go
``` ```
Updating Dependencies Updating Dependencies
--------------- ---------------
Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory. Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory.
In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory: In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory:
``` ```
go mod edit -require=<package>@<version> # for adding or updating a dependency go mod edit -require=<package>@<version> # for adding or updating a dependency
go mod edit -droprequire=<package> # for removing a dependency go mod edit -droprequire=<package> # for removing a dependency
``` ```
Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file. Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file.
Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code. Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code.
Contributing Contributing
--------------- ---------------
See our [Contributor's Guide](CONTRIBUTING.md). See our [Contributor's Guide](CONTRIBUTING.md).
Documentation Documentation
--------------- ---------------
See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/). See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/).
For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual): For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual):
- [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program) - [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program)
- [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program) - [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program)
- [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program) - [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program)
Adding New Platforms Support Adding New Platforms Support
--------------- ---------------
See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md). See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md).
Vendoring the Change into Server Repo Vendoring the Change into Server Repo
--------------- ---------------
See our [Vendor the Change into Server Repo](SERVERVENDORING.md). See our [Vendor the Change into Server Repo](SERVERVENDORING.md).

View File

@@ -1,373 +1,373 @@
Mozilla Public License Version 2.0 Mozilla Public License Version 2.0
================================== ==================================
1. Definitions 1. Definitions
-------------- --------------
1.1. "Contributor" 1.1. "Contributor"
means each individual or legal entity that creates, contributes to means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software. the creation of, or owns Covered Software.
1.2. "Contributor Version" 1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution. by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution" 1.3. "Contribution"
means Covered Software of a particular Contributor. means Covered Software of a particular Contributor.
1.4. "Covered Software" 1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case Form, and Modifications of such Source Code Form, in each case
including portions thereof. including portions thereof.
1.5. "Incompatible With Secondary Licenses" 1.5. "Incompatible With Secondary Licenses"
means means
(a) that the initial Contributor has attached the notice described (a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of (b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the version 1.1 or earlier of the License, but not also under the
terms of a Secondary License. terms of a Secondary License.
1.6. "Executable Form" 1.6. "Executable Form"
means any form of the work other than Source Code Form. means any form of the work other than Source Code Form.
1.7. "Larger Work" 1.7. "Larger Work"
means a work that combines Covered Software with other material, in means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software. a separate file or files, that is not Covered Software.
1.8. "License" 1.8. "License"
means this document. means this document.
1.9. "Licensable" 1.9. "Licensable"
means having the right to grant, to the maximum extent possible, means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License. all of the rights conveyed by this License.
1.10. "Modifications" 1.10. "Modifications"
means any of the following: means any of the following:
(a) any file in Source Code Form that results from an addition to, (a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered deletion from, or modification of the contents of Covered
Software; or Software; or
(b) any new file in Source Code Form that contains any Covered (b) any new file in Source Code Form that contains any Covered
Software. Software.
1.11. "Patent Claims" of a Contributor 1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method, means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its made, import, or transfer of either its Contributions or its
Contributor Version. Contributor Version.
1.12. "Secondary License" 1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those Public License, Version 3.0, or any later versions of those
licenses. licenses.
1.13. "Source Code Form" 1.13. "Source Code Form"
means the form of the work preferred for making modifications. means the form of the work preferred for making modifications.
1.14. "You" (or "Your") 1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity, or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity. ownership of such entity.
2. License Grants and Conditions 2. License Grants and Conditions
-------------------------------- --------------------------------
2.1. Grants 2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free, Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license: non-exclusive license:
(a) under intellectual property rights (other than patent or trademark) (a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available, Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer (b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version. Contributions or its Contributor Version.
2.2. Effective Date 2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first become effective for each Contribution on the date the Contributor first
distributes such Contribution. distributes such Contribution.
2.3. Limitations on Grant Scope 2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License. distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor: Contributor:
(a) for any code that a Contributor has removed from Covered Software; (a) for any code that a Contributor has removed from Covered Software;
or or
(b) for infringements caused by: (i) Your and any other third party's (b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor Contributions with other software (except as part of its Contributor
Version); or Version); or
(c) under Patent Claims infringed by Covered Software in the absence of (c) under Patent Claims infringed by Covered Software in the absence of
its Contributions. its Contributions.
This License does not grant any rights in the trademarks, service marks, This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4). the notice requirements in Section 3.4).
2.4. Subsequent Licenses 2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3). permitted under the terms of Section 3.3).
2.5. Representation 2.5. Representation
Each Contributor represents that the Contributor believes its Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License. to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use 2.6. Fair Use
This License is not intended to limit any rights You have under This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other applicable copyright doctrines of fair use, fair dealing, or other
equivalents. equivalents.
2.7. Conditions 2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1. in Section 2.1.
3. Responsibilities 3. Responsibilities
------------------- -------------------
3.1. Distribution of Source Form 3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code attempt to alter or restrict the recipients' rights in the Source Code
Form. Form.
3.2. Distribution of Executable Form 3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then: If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code (a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this (b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License. the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work 3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice, You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary Software under the terms of either this License or such Secondary
License(s). License(s).
3.4. Notices 3.4. Notices
You may not remove or alter the substance of any license notices You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, (including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies. the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms 3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support, You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support, liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any disclaimers of warranty and limitations of liability specific to any
jurisdiction. jurisdiction.
4. Inability to Comply Due to Statute or Regulation 4. Inability to Comply Due to Statute or Regulation
--------------------------------------------------- ---------------------------------------------------
If it is impossible for You to comply with any of the terms of this If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b) the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it. recipient of ordinary skill to be able to understand it.
5. Termination 5. Termination
-------------- --------------
5.1. The rights granted under this License will terminate automatically 5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice. Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent 5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions, infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate. 2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License have been validly granted by You or Your distributors under this License
prior to termination shall survive termination. prior to termination shall survive termination.
************************************************************************ ************************************************************************
* * * *
* 6. Disclaimer of Warranty * * 6. Disclaimer of Warranty *
* ------------------------- * * ------------------------- *
* * * *
* Covered Software is provided under this License on an "as is" * * Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or * * basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the * * statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a * * Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the * * particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. * * quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You * * Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, * * (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an * * repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is * * essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. * * authorized under this License except under this disclaimer. *
* * * *
************************************************************************ ************************************************************************
************************************************************************ ************************************************************************
* * * *
* 7. Limitation of Liability * * 7. Limitation of Liability *
* -------------------------- * * -------------------------- *
* * * *
* Under no circumstances and under no legal theory, whether tort * * Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any * * (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as * * Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, * * permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character * * special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of * * including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any * * goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party * * and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This * * shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or * * limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the * * personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some * * extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of * * jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and * * incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. * * limitation may not apply to You. *
* * * *
************************************************************************ ************************************************************************
8. Litigation 8. Litigation
------------- -------------
Any litigation relating to this License may be brought only in the Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims. cross-claims or counter-claims.
9. Miscellaneous 9. Miscellaneous
---------------- ----------------
This License represents the complete agreement concerning the subject This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor. shall not be used to construe this License against a Contributor.
10. Versions of the License 10. Versions of the License
--------------------------- ---------------------------
10.1. New Versions 10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or 10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a publish new versions of this License. Each version will be given a
distinguishing version number. distinguishing version number.
10.2. Effect of New Versions 10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software, of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license or under the terms of any subsequent version published by the license
steward. steward.
10.3. Modified Versions 10.3. Modified Versions
If you create software not governed by this License, and you want to If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that any references to the name of the license steward (except to note that
such modified license differs from this License). such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary 10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses Licenses
If You choose to distribute Source Code Form that is Incompatible With If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached. notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice Exhibit A - Source Code Form License Notice
------------------------------------------- -------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look file in a relevant directory) where a recipient would be likely to look
for such a notice. for such a notice.
You may add additional accurate notices of copyright ownership. You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice Exhibit B - "Incompatible With Secondary Licenses" Notice
--------------------------------------------------------- ---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0. defined by the Mozilla Public License, v. 2.0.

View File

@@ -1,87 +1,87 @@
MongoDB README MongoDB README
Welcome to MongoDB! Welcome to MongoDB!
COMPONENTS COMPONENTS
mongod - The database server. mongod - The database server.
mongos - Sharding router. mongos - Sharding router.
mongo - The database shell (uses interactive javascript). mongo - The database shell (uses interactive javascript).
UTILITIES UTILITIES
install_compass - Installs MongoDB Compass for your platform. install_compass - Installs MongoDB Compass for your platform.
BUILDING BUILDING
See docs/building.md. See docs/building.md.
RUNNING RUNNING
For command line options invoke: For command line options invoke:
$ ./mongod --help $ ./mongod --help
To run a single server database: To run a single server database:
$ sudo mkdir -p /data/db $ sudo mkdir -p /data/db
$ ./mongod $ ./mongod
$ $
$ # The mongo javascript shell connects to localhost and test database by default: $ # The mongo javascript shell connects to localhost and test database by default:
$ ./mongo $ ./mongo
> help > help
INSTALLING COMPASS INSTALLING COMPASS
You can install compass using the install_compass script packaged with MongoDB: You can install compass using the install_compass script packaged with MongoDB:
$ ./install_compass $ ./install_compass
This will download the appropriate MongoDB Compass package for your platform This will download the appropriate MongoDB Compass package for your platform
and install it. and install it.
DRIVERS DRIVERS
Client drivers for most programming languages are available at Client drivers for most programming languages are available at
https://docs.mongodb.com/manual/applications/drivers/. Use the shell https://docs.mongodb.com/manual/applications/drivers/. Use the shell
("mongo") for administrative tasks. ("mongo") for administrative tasks.
BUG REPORTS BUG REPORTS
See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports. See https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports.
PACKAGING PACKAGING
Packages are created dynamically by the package.py script located in the Packages are created dynamically by the package.py script located in the
buildscripts directory. This will generate RPM and Debian packages. buildscripts directory. This will generate RPM and Debian packages.
DOCUMENTATION DOCUMENTATION
https://docs.mongodb.com/manual/ https://docs.mongodb.com/manual/
CLOUD HOSTED MONGODB CLOUD HOSTED MONGODB
https://www.mongodb.com/cloud/atlas https://www.mongodb.com/cloud/atlas
FORUMS FORUMS
https://community.mongodb.com https://community.mongodb.com
A forum for technical questions about using MongoDB. A forum for technical questions about using MongoDB.
https://community.mongodb.com/c/server-dev https://community.mongodb.com/c/server-dev
A forum for technical questions about building and developing MongoDB. A forum for technical questions about building and developing MongoDB.
LEARN MONGODB LEARN MONGODB
https://university.mongodb.com/ https://university.mongodb.com/
LICENSE LICENSE
MongoDB is free and open-source. Versions released prior to October 16, MongoDB is free and open-source. Versions released prior to October 16,
2018 are published under the AGPL. All versions released after October 2018 are published under the AGPL. All versions released after October
16, 2018, including patch fixes for prior versions, are published under 16, 2018, including patch fixes for prior versions, are published under
the Server Side Public License (SSPL) v1. See individual files for the Server Side Public License (SSPL) v1. See individual files for
details. details.

View File

@@ -1,13 +1,13 @@
Copyright 2014 MongoDB, Inc. Copyright 2014 MongoDB, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@@ -1,72 +1,72 @@
MongoDB Tools MongoDB Tools
=================================== ===================================
- **bsondump** - _display BSON files in a human-readable format_ - **bsondump** - _display BSON files in a human-readable format_
- **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_ - **mongoimport** - _Convert data from JSON, TSV or CSV and insert them into a collection_
- **mongoexport** - _Write an existing collection to CSV or JSON format_ - **mongoexport** - _Write an existing collection to CSV or JSON format_
- **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_ - **mongodump/mongorestore** - _Dump MongoDB backups to disk in .BSON format, or restore them to a live database_
- **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_ - **mongostat** - _Monitor live MongoDB servers, replica sets, or sharded clusters_
- **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_ - **mongofiles** - _Read, write, delete, or update files in [GridFS](http://docs.mongodb.org/manual/core/gridfs/)_
- **mongotop** - _Monitor read/write activity on a mongo server_ - **mongotop** - _Monitor read/write activity on a mongo server_
Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS Report any bugs, improvements, or new feature requests at https://jira.mongodb.org/browse/TOOLS
Building Tools Building Tools
--------------- ---------------
We currently build the tools with Go version 1.15. Other Go versions may work but they are untested. We currently build the tools with Go version 1.15. Other Go versions may work but they are untested.
Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository: Using `go get` to directly build the tools will not work. To build them, it's recommended to first clone this repository:
``` ```
git clone https://github.com/mongodb/mongo-tools git clone https://github.com/mongodb/mongo-tools
cd mongo-tools cd mongo-tools
``` ```
Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository. Then run `./make build` to build all the tools, placing them in the `bin` directory inside the repository.
You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`. You can also build a subset of the tools using the `-tools` option. For example, `./make build -tools=mongodump,mongorestore` builds only `mongodump` and `mongorestore`.
To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go. To use the build/test scripts in this repository, you **_must_** set GOROOT to your Go root directory. This may depend on how you installed Go.
``` ```
export GOROOT=/usr/local/go export GOROOT=/usr/local/go
``` ```
Updating Dependencies Updating Dependencies
--------------- ---------------
Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory. Starting with version 100.3.1, the tools use `go mod` to manage dependencies. All dependencies are listed in the `go.mod` file and are directly vendored in the `vendor` directory.
In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory: In order to make changes to dependencies, you first need to change the `go.mod` file. You can manually edit that file to add/update/remove entries, or you can run the following in the repository directory:
``` ```
go mod edit -require=<package>@<version> # for adding or updating a dependency go mod edit -require=<package>@<version> # for adding or updating a dependency
go mod edit -droprequire=<package> # for removing a dependency go mod edit -droprequire=<package> # for removing a dependency
``` ```
Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file. Then run `go mod vendor -v` to reconstruct the `vendor` directory to match the changed `go.mod` file.
Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code. Optionally, run `go mod tidy -v` to ensure that the `go.mod` file matches the `mongo-tools` source code.
Contributing Contributing
--------------- ---------------
See our [Contributor's Guide](CONTRIBUTING.md). See our [Contributor's Guide](CONTRIBUTING.md).
Documentation Documentation
--------------- ---------------
See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/). See the MongoDB packages [documentation](https://docs.mongodb.org/database-tools/).
For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual): For documentation on older versions of the MongoDB, reference that version of the [MongoDB Server Manual](docs.mongodb.com/manual):
- [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program) - [MongoDB 4.2 Tools](https://docs.mongodb.org/v4.2/reference/program)
- [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program) - [MongoDB 4.0 Tools](https://docs.mongodb.org/v4.0/reference/program)
- [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program) - [MongoDB 3.6 Tools](https://docs.mongodb.org/v3.6/reference/program)
Adding New Platforms Support Adding New Platforms Support
--------------- ---------------
See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md). See our [Adding New Platform Support Guide](PLATFORMSUPPORT.md).
Vendoring the Change into Server Repo Vendoring the Change into Server Repo
--------------- ---------------
See our [Vendor the Change into Server Repo](SERVERVENDORING.md). See our [Vendor the Change into Server Repo](SERVERVENDORING.md).

View File

@@ -1,373 +1,373 @@
Mozilla Public License Version 2.0 Mozilla Public License Version 2.0
================================== ==================================
1. Definitions 1. Definitions
-------------- --------------
1.1. "Contributor" 1.1. "Contributor"
means each individual or legal entity that creates, contributes to means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software. the creation of, or owns Covered Software.
1.2. "Contributor Version" 1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution. by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution" 1.3. "Contribution"
means Covered Software of a particular Contributor. means Covered Software of a particular Contributor.
1.4. "Covered Software" 1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case Form, and Modifications of such Source Code Form, in each case
including portions thereof. including portions thereof.
1.5. "Incompatible With Secondary Licenses" 1.5. "Incompatible With Secondary Licenses"
means means
(a) that the initial Contributor has attached the notice described (a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of (b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the version 1.1 or earlier of the License, but not also under the
terms of a Secondary License. terms of a Secondary License.
1.6. "Executable Form" 1.6. "Executable Form"
means any form of the work other than Source Code Form. means any form of the work other than Source Code Form.
1.7. "Larger Work" 1.7. "Larger Work"
means a work that combines Covered Software with other material, in means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software. a separate file or files, that is not Covered Software.
1.8. "License" 1.8. "License"
means this document. means this document.
1.9. "Licensable" 1.9. "Licensable"
means having the right to grant, to the maximum extent possible, means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License. all of the rights conveyed by this License.
1.10. "Modifications" 1.10. "Modifications"
means any of the following: means any of the following:
(a) any file in Source Code Form that results from an addition to, (a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered deletion from, or modification of the contents of Covered
Software; or Software; or
(b) any new file in Source Code Form that contains any Covered (b) any new file in Source Code Form that contains any Covered
Software. Software.
1.11. "Patent Claims" of a Contributor 1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method, means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its made, import, or transfer of either its Contributions or its
Contributor Version. Contributor Version.
1.12. "Secondary License" 1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those Public License, Version 3.0, or any later versions of those
licenses. licenses.
1.13. "Source Code Form" 1.13. "Source Code Form"
means the form of the work preferred for making modifications. means the form of the work preferred for making modifications.
1.14. "You" (or "Your") 1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity, or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity. ownership of such entity.
2. License Grants and Conditions 2. License Grants and Conditions
-------------------------------- --------------------------------
2.1. Grants 2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free, Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license: non-exclusive license:
(a) under intellectual property rights (other than patent or trademark) (a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available, Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer (b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version. Contributions or its Contributor Version.
2.2. Effective Date 2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first become effective for each Contribution on the date the Contributor first
distributes such Contribution. distributes such Contribution.
2.3. Limitations on Grant Scope 2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License. distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor: Contributor:
(a) for any code that a Contributor has removed from Covered Software; (a) for any code that a Contributor has removed from Covered Software;
or or
(b) for infringements caused by: (i) Your and any other third party's (b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor Contributions with other software (except as part of its Contributor
Version); or Version); or
(c) under Patent Claims infringed by Covered Software in the absence of (c) under Patent Claims infringed by Covered Software in the absence of
its Contributions. its Contributions.
This License does not grant any rights in the trademarks, service marks, This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4). the notice requirements in Section 3.4).
2.4. Subsequent Licenses 2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3). permitted under the terms of Section 3.3).
2.5. Representation 2.5. Representation
Each Contributor represents that the Contributor believes its Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License. to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use 2.6. Fair Use
This License is not intended to limit any rights You have under This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other applicable copyright doctrines of fair use, fair dealing, or other
equivalents. equivalents.
2.7. Conditions 2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1. in Section 2.1.
3. Responsibilities 3. Responsibilities
------------------- -------------------
3.1. Distribution of Source Form 3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code attempt to alter or restrict the recipients' rights in the Source Code
Form. Form.
3.2. Distribution of Executable Form 3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then: If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code (a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this (b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License. the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work 3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice, You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary Software under the terms of either this License or such Secondary
License(s). License(s).
3.4. Notices 3.4. Notices
You may not remove or alter the substance of any license notices You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, (including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies. the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms 3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support, You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support, liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any disclaimers of warranty and limitations of liability specific to any
jurisdiction. jurisdiction.
4. Inability to Comply Due to Statute or Regulation 4. Inability to Comply Due to Statute or Regulation
--------------------------------------------------- ---------------------------------------------------
If it is impossible for You to comply with any of the terms of this If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b) the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it. recipient of ordinary skill to be able to understand it.
5. Termination 5. Termination
-------------- --------------
5.1. The rights granted under this License will terminate automatically 5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice. Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent 5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions, infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate. 2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License have been validly granted by You or Your distributors under this License
prior to termination shall survive termination. prior to termination shall survive termination.
************************************************************************ ************************************************************************
* * * *
* 6. Disclaimer of Warranty * * 6. Disclaimer of Warranty *
* ------------------------- * * ------------------------- *
* * * *
* Covered Software is provided under this License on an "as is" * * Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or * * basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the * * statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a * * Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the * * particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. * * quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You * * Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, * * (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an * * repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is * * essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. * * authorized under this License except under this disclaimer. *
* * * *
************************************************************************ ************************************************************************
************************************************************************ ************************************************************************
* * * *
* 7. Limitation of Liability * * 7. Limitation of Liability *
* -------------------------- * * -------------------------- *
* * * *
* Under no circumstances and under no legal theory, whether tort * * Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any * * (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as * * Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, * * permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character * * special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of * * including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any * * goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party * * and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This * * shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or * * limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the * * personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some * * extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of * * jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and * * incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. * * limitation may not apply to You. *
* * * *
************************************************************************ ************************************************************************
8. Litigation 8. Litigation
------------- -------------
Any litigation relating to this License may be brought only in the Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims. cross-claims or counter-claims.
9. Miscellaneous 9. Miscellaneous
---------------- ----------------
This License represents the complete agreement concerning the subject This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor. shall not be used to construe this License against a Contributor.
10. Versions of the License 10. Versions of the License
--------------------------- ---------------------------
10.1. New Versions 10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or 10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a publish new versions of this License. Each version will be given a
distinguishing version number. distinguishing version number.
10.2. Effect of New Versions 10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software, of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license or under the terms of any subsequent version published by the license
steward. steward.
10.3. Modified Versions 10.3. Modified Versions
If you create software not governed by this License, and you want to If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that any references to the name of the license steward (except to note that
such modified license differs from this License). such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary 10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses Licenses
If You choose to distribute Source Code Form that is Incompatible With If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached. notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice Exhibit A - Source Code Form License Notice
------------------------------------------- -------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look file in a relevant directory) where a recipient would be likely to look
for such a notice. for such a notice.
You may add additional accurate notices of copyright ownership. You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice Exhibit B - "Incompatible With Secondary Licenses" Notice
--------------------------------------------------------- ---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0. defined by the Mozilla Public License, v. 2.0.

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