Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6465152ce9 | ||
|
|
bba2ce73bc | ||
|
|
c9f6b4a624 | ||
|
|
8d2218c621 | ||
|
|
c43caa6782 | ||
|
|
bbb232759a | ||
|
|
ba00901a2e | ||
|
|
fea9a70a36 | ||
|
|
64f41a665b | ||
|
|
b1d05d399b | ||
|
|
29d3a7a7ad | ||
|
|
58ad325b1e |
33
.github/workflows/release.yml
vendored
Normal file
33
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
name: release
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Fetch tags and master for GitVersion
|
||||
run: |
|
||||
git fetch --tags
|
||||
git branch --create-reflog master origin/master
|
||||
- name: Install GitVersion
|
||||
uses: ./setup-gitversion
|
||||
with:
|
||||
versionSpec: '5.1.x'
|
||||
- name: Use GitVersion
|
||||
id: gitversion # step id used as reference for output values
|
||||
uses: ./execute-gitversion
|
||||
- run: |
|
||||
npm install
|
||||
$date = Get-Date -format "yyMMddHHmm"
|
||||
$version = "${{steps.gitversion.outputs.majorMinorPatch}}.$date"
|
||||
$override = '{\"version\": \"' + $version + '\"}'
|
||||
npm run publish-azure -- --token ${{ secrets.TFX_TOKEN }} --override $override
|
||||
shell: pwsh
|
||||
name: Publish Azure extension
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -2,4 +2,5 @@ node_modules/
|
||||
|
||||
.taskkey
|
||||
*.js
|
||||
!dist/**/*.js
|
||||
!dist/**/*.js
|
||||
*.vsix
|
||||
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Git Tools
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
29
README.md
29
README.md
@@ -41,5 +41,34 @@ Basic:
|
||||
id: gitversion # step id used as reference for output values
|
||||
uses: gittools/actions/execute-gitversion@v0.3
|
||||
- run: |
|
||||
echo "Major: ${{ steps.gitversion.outputs.major }}"
|
||||
echo "Minor: ${{ steps.gitversion.outputs.minor }}"
|
||||
echo "Patch: ${{ steps.gitversion.outputs.patch }}"
|
||||
echo "PreReleaseTag: ${{ steps.gitversion.outputs.preReleaseTag }}"
|
||||
echo "PreReleaseTagWithDash: ${{ steps.gitversion.outputs.preReleaseTagWithDash }}"
|
||||
echo "PreReleaseLabel: ${{ steps.gitversion.outputs.preReleaseLabel }}"
|
||||
echo "PreReleaseNumber: ${{ steps.gitversion.outputs.preReleaseNumber }}"
|
||||
echo "WeightedPreReleaseNumber: ${{ steps.gitversion.outputs.weightedPreReleaseNumber }}"
|
||||
echo "BuildMetaData: ${{ steps.gitversion.outputs.buildMetaData }}"
|
||||
echo "BuildMetaDataPadded: ${{ steps.gitversion.outputs.buildMetaDataPadded }}"
|
||||
echo "FullBuildMetaData: ${{ steps.gitversion.outputs.fullBuildMetaData }}"
|
||||
echo "MajorMinorPatch: ${{ steps.gitversion.outputs.majorMinorPatch }}"
|
||||
echo "SemVer: ${{ steps.gitversion.outputs.semVer }}"
|
||||
echo "LegacySemVer: ${{ steps.gitversion.outputs.legacySemVer }}"
|
||||
echo "LegacySemVerPadded: ${{ steps.gitversion.outputs.legacySemVerPadded }}"
|
||||
echo "AssemblySemVer: ${{ steps.gitversion.outputs.assemblySemVer }}"
|
||||
echo "AssemblySemFileVer: ${{ steps.gitversion.outputs.assemblySemFileVer }}"
|
||||
echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}"
|
||||
echo "InformationalVersion: ${{ steps.gitversion.outputs.informationalVersion }}"
|
||||
echo "BranchName: ${{ steps.gitversion.outputs.branchName }}"
|
||||
echo "Sha: ${{ steps.gitversion.outputs.sha }}"
|
||||
echo "ShortSha: ${{ steps.gitversion.outputs.shortSha }}"
|
||||
echo "NuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }}"
|
||||
echo "NuGetVersion: ${{ steps.gitversion.outputs.nuGetVersion }}"
|
||||
echo "NuGetPreReleaseTagV2: ${{ steps.gitversion.outputs.nuGetPreReleaseTagV2 }}"
|
||||
echo "NuGetPreReleaseTag: ${{ steps.gitversion.outputs.nuGetPreReleaseTag }}"
|
||||
echo "VersionSourceSha: ${{ steps.gitversion.outputs.versionSourceSha }}"
|
||||
echo "CommitsSinceVersionSource: ${{ steps.gitversion.outputs.commitsSinceVersionSource }}"
|
||||
echo "CommitsSinceVersionSourcePadded: ${{ steps.gitversion.outputs.commitsSinceVersionSourcePadded }}"
|
||||
echo "CommitDate: ${{ steps.gitversion.outputs.commitDate }}"
|
||||
```
|
||||
|
||||
BIN
dist/azure/execute-gitversion/icon.png
vendored
Normal file
BIN
dist/azure/execute-gitversion/icon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
89
dist/azure/execute-gitversion/task.json
vendored
Normal file
89
dist/azure/execute-gitversion/task.json
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"id": "9013cf7f-ee8d-49f4-a39b-db244928d391",
|
||||
"name": "gitversion-execute",
|
||||
"friendlyName": "Execute GitVersion Task",
|
||||
"description": "Easy Semantic Versioning (http://semver.org) for projects using Git",
|
||||
"author": "GitVersion Contributors",
|
||||
"helpMarkDown": "See the [documentation](http://gitversion.readthedocs.org/en/latest/) for help",
|
||||
"category": "Build",
|
||||
"demands": [],
|
||||
"version": {
|
||||
"Major": "5",
|
||||
"Minor": "0",
|
||||
"Patch": "2"
|
||||
},
|
||||
"minimumAgentVersion": "2.115.0",
|
||||
"instanceNameFormat": "gitversion-execute",
|
||||
"groups": [{
|
||||
"name": "gitversionDetails",
|
||||
"displayName": "GitVersion details",
|
||||
"isExpanded": true
|
||||
},
|
||||
{
|
||||
"name": "additional",
|
||||
"displayName": "Additional Options",
|
||||
"isExpanded": false
|
||||
}
|
||||
],
|
||||
"inputs": [{
|
||||
"name": "targetPath",
|
||||
"type": "string",
|
||||
"label": "Working directory path",
|
||||
"defaultValue": "",
|
||||
"required": false,
|
||||
"helpMarkDown": "Optionally supply the path to the working directory",
|
||||
"groupName": "gitversionDetails"
|
||||
},
|
||||
{
|
||||
"name": "useConfigFile",
|
||||
"type": "boolean",
|
||||
"label": "Specify Configuration file",
|
||||
"defaultValue": "false",
|
||||
"required": false,
|
||||
"helpMarkDown": "Whether to use a custom configuration file"
|
||||
},
|
||||
{
|
||||
"name": "configFilePath",
|
||||
"type": "filePath",
|
||||
"label": "Configuration file",
|
||||
"defaultValue": "",
|
||||
"required": false,
|
||||
"helpMarkDown": "Optional path to config file (defaults to GitVersion.yml)",
|
||||
"visibleRule": "useConfigFile = true"
|
||||
},
|
||||
{
|
||||
"name": "updateAssemblyInfo",
|
||||
"type": "boolean",
|
||||
"label": "Update AssemblyInfo files",
|
||||
"defaultValue": "false",
|
||||
"required": false,
|
||||
"helpMarkDown": "Whether to update versions in the AssemblyInfo files"
|
||||
},
|
||||
{
|
||||
"name": "updateAssemblyInfoFilename",
|
||||
"type": "string",
|
||||
"label": "Update Assembly File",
|
||||
"defaultValue": "",
|
||||
"required": false,
|
||||
"helpMarkDown": "Update versions in specified file",
|
||||
"visibleRule": "updateAssemblyInfo = true"
|
||||
},
|
||||
{
|
||||
"name": "additionalArguments",
|
||||
"type": "string",
|
||||
"label": "Additional GitVersion arguments",
|
||||
"defaultValue": "",
|
||||
"required": false,
|
||||
"helpMarkDown": "Additional arguments to send to GitVersion",
|
||||
"groupName": "additional"
|
||||
}
|
||||
],
|
||||
|
||||
"execution": {
|
||||
"Node": {
|
||||
"target": "index.js",
|
||||
"argumentFormat": "",
|
||||
"workingDirectory": "."
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
dist/azure/images/build-task.png
vendored
Normal file
BIN
dist/azure/images/build-task.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
dist/azure/images/builds.png
vendored
Normal file
BIN
dist/azure/images/builds.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
BIN
dist/azure/images/icon.png
vendored
Normal file
BIN
dist/azure/images/icon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
16558
dist/azure/index.js
vendored
16558
dist/azure/index.js
vendored
File diff suppressed because one or more lines are too long
6
dist/azure/overview.md
vendored
Normal file
6
dist/azure/overview.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
Versioning when using Git, solved. GitVersion looks at your Git history and works out the [semantic version](http://semver.org) of the commit being built.
|
||||
|
||||
It works with most branching strategies but has been designed mainly around GitFlow and GitHubFlow (pull request workflow). The calculated version numbers can then be accessed through variables such as `$(GitVersion.NuGetVersion)` and `$(GitVersion.SemVer)`. It is also very configurable to allow it to work with most release workflows!
|
||||
|
||||

|
||||

|
||||
BIN
dist/azure/setup-gitversion/icon.png
vendored
Normal file
BIN
dist/azure/setup-gitversion/icon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
42
dist/azure/setup-gitversion/task.json
vendored
Normal file
42
dist/azure/setup-gitversion/task.json
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"id": "a06c02ae-7b9a-4082-90dc-fe27b500e54f",
|
||||
"name": "gitversion-setup",
|
||||
"friendlyName": "Setup GitVersion Task",
|
||||
"description": "Easy Semantic Versioning (http://semver.org) for projects using Git",
|
||||
"author": "GitVersion Contributors",
|
||||
"helpMarkDown": "See the [documentation](http://gitversion.readthedocs.org/en/latest/) for help",
|
||||
"category": "Build",
|
||||
"demands": [],
|
||||
"version": {
|
||||
"Major": "5",
|
||||
"Minor": "0",
|
||||
"Patch": "2"
|
||||
},
|
||||
"minimumAgentVersion": "2.115.0",
|
||||
"inputs": [{
|
||||
"name": "versionSpec",
|
||||
"type": "string",
|
||||
"label": "The version spec",
|
||||
"defaultValue": "",
|
||||
"required": true,
|
||||
"helpMarkDown": "Required version in the form of 5.x or exact version like 5.0.0"
|
||||
},
|
||||
{
|
||||
"name": "includePrerelease",
|
||||
"type": "boolean",
|
||||
"label": "Include pre-release versions",
|
||||
"defaultValue": "false",
|
||||
"required": false,
|
||||
"helpMarkDown": "Include pre-release versions when matching a version"
|
||||
}
|
||||
],
|
||||
"instanceNameFormat": "gitversion-setup",
|
||||
|
||||
"execution": {
|
||||
"Node": {
|
||||
"target": "index.js",
|
||||
"argumentFormat": "",
|
||||
"workingDirectory": "."
|
||||
}
|
||||
}
|
||||
}
|
||||
14
dist/azure/setup/lib.json
vendored
14
dist/azure/setup/lib.json
vendored
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"messages": {
|
||||
"TOOL_LIB_CachingTool": "Caching tool: %s %s %s",
|
||||
"_TOOL_LIB_CachingTool.comment": "This informational log message indicates that a tool, that was just downloaded, is being copied into the cache directory. %s %s %s represent the tool name, version information, and processor architecture.",
|
||||
"TOOL_LIB_Downloading": "Downloading: %s",
|
||||
"_TOOL_LIB_Downloading.comment": "This information log message indicates that a file is being downloaded. %s represents the URL being downloaded.",
|
||||
"TOOL_LIB_ExtractingArchive": "Extracting archive",
|
||||
"_TOOL_LIB_ExtractingArchive.comment": "This informational log message indicates that an archive file is being extracted. For example, a .zip file, .7z file, or .tar.gz file.",
|
||||
"TOOL_LIB_FoundInCache": "Found tool in cache: %s %s %s",
|
||||
"_TOOL_LIB_FoundInCache.comment": "This informational log message indicates that the request tool is already cached, and does not need to be downloaded again. %s %s %s represent the tool name, version information, and processor architecture.",
|
||||
"TOOL_LIB_PrependPath": "Prepending PATH environment variable with directory: %s",
|
||||
"_TOOL_LIB_PrependPath.comment": "This informational log message indicates that a directory is being prepended to the front of the PATH environment variable. The directories specified by the PATH environment variable are used to resolve the location of command line tools."
|
||||
}
|
||||
}
|
||||
36
dist/azure/setup/lib1.json
vendored
36
dist/azure/setup/lib1.json
vendored
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"messages": {
|
||||
"LIB_UnhandledEx": "Unhandled: %s",
|
||||
"LIB_FailOnCode": "Failure return code: %d",
|
||||
"LIB_MkdirFailed": "Unable to create directory '%s'. %s",
|
||||
"LIB_MkdirFailedFileExists": "Unable to create directory '%s'. Conflicting file exists: '%s'",
|
||||
"LIB_MkdirFailedInvalidDriveRoot": "Unable to create directory '%s'. Root directory does not exist: '%s'",
|
||||
"LIB_MkdirFailedInvalidShare": "Unable to create directory '%s'. Unable to verify the directory exists: '%s'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share.",
|
||||
"LIB_MultilineSecret": "Secrets cannot contain multiple lines",
|
||||
"LIB_ProcessError": "There was an error when attempting to execute the process '%s'. This may indicate the process failed to start. Error: %s",
|
||||
"LIB_ProcessExitCode": "The process '%s' failed with exit code %s",
|
||||
"LIB_ProcessStderr": "The process '%s' failed because one or more lines were written to the STDERR stream",
|
||||
"LIB_ReturnCode": "Return code: %d",
|
||||
"LIB_ResourceFileNotExist": "Resource file doesn\\'t exist: %s",
|
||||
"LIB_ResourceFileAlreadySet": "Resource file has already set to: %s",
|
||||
"LIB_ResourceFileNotSet": "Resource file haven\\'t set, can\\'t find loc string for key: %s",
|
||||
"LIB_StdioNotClosed": "The STDIO streams did not close within %s seconds of the exit event from process '%s'. This may indicate a child process inherited the STDIO streams and has not yet exited.",
|
||||
"LIB_WhichNotFound_Linux": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.",
|
||||
"LIB_WhichNotFound_Win": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.",
|
||||
"LIB_LocStringNotFound": "Can\\'t find loc string for key: %s",
|
||||
"LIB_ParameterIsRequired": "%s not supplied",
|
||||
"LIB_InputRequired": "Input required: %s",
|
||||
"LIB_InvalidPattern": "Invalid pattern: '%s'",
|
||||
"LIB_EndpointNotExist": "Endpoint not present: %s",
|
||||
"LIB_EndpointDataNotExist": "Endpoint data parameter %s not present: %s",
|
||||
"LIB_EndpointAuthNotExist": "Endpoint auth data not present: %s",
|
||||
"LIB_InvalidEndpointAuth": "Invalid endpoint auth: %s",
|
||||
"LIB_InvalidSecureFilesInput": "Invalid secure file input: %s",
|
||||
"LIB_PathNotFound": "Not found %s: %s",
|
||||
"LIB_PathHasNullByte": "Path cannot contain null bytes",
|
||||
"LIB_OperationFailed": "Failed %s: %s",
|
||||
"LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.",
|
||||
"LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.",
|
||||
"LIB_PlatformNotSupported": "Platform not supported: %s"
|
||||
}
|
||||
}
|
||||
81
dist/azure/vss-extension.json
vendored
Normal file
81
dist/azure/vss-extension.json
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"manifestVersion": 1,
|
||||
"id": "gittools",
|
||||
"name": "GitTools",
|
||||
"version": "0.0.1",
|
||||
"publisher": "gittools",
|
||||
"public": true,
|
||||
"author": "GitTools Contributors",
|
||||
"description": "Build tasks for easy semantic versioning for projects using Git and release management.",
|
||||
"targets": [{
|
||||
"id": "Microsoft.VisualStudio.Services"
|
||||
}],
|
||||
"files": [
|
||||
{ "path": "execute-gitversion" },
|
||||
{ "path": "setup-gitversion" }
|
||||
],
|
||||
"categories": [
|
||||
"Azure Pipelines"
|
||||
],
|
||||
"galleryFlags": [
|
||||
"Public"
|
||||
],
|
||||
"icons": {
|
||||
"default": "images/icon.png"
|
||||
},
|
||||
"tags": [
|
||||
"semver",
|
||||
"git",
|
||||
"versioning",
|
||||
"gitflow",
|
||||
"githubflow"
|
||||
],
|
||||
"links": {
|
||||
"learn": {
|
||||
"uri": "http://gitversion.readthedocs.org/en/stable"
|
||||
},
|
||||
"getstarted": {
|
||||
"uri": "http://gitversion.readthedocs.org/en/stable/build-server-support/build-server/tfs-build-vnext/#running-inside-tfs"
|
||||
},
|
||||
"license": {
|
||||
"uri": "https://github.com/GitTools/actions/blob/master/LICENSE"
|
||||
},
|
||||
"repository": {
|
||||
"uri": "https://github.com/GitTools/actions.git"
|
||||
},
|
||||
"support": {
|
||||
"uri": "https://github.com/GitTools/actions/issues"
|
||||
}
|
||||
},
|
||||
"screenshots": [{
|
||||
"path": "images/builds.png"
|
||||
},
|
||||
{
|
||||
"path": "images/build-task.png"
|
||||
}
|
||||
],
|
||||
"content": {
|
||||
"details": {
|
||||
"path": "overview.md"
|
||||
}
|
||||
},
|
||||
"contributions": [{
|
||||
"id": "setup-gitversion-task",
|
||||
"type": "ms.vss-distributed-task.task",
|
||||
"targets": [
|
||||
"ms.vss-distributed-task.tasks"
|
||||
],
|
||||
"properties": {
|
||||
"name": "setup-gitversion"
|
||||
}
|
||||
}, {
|
||||
"id": "execute-gitversion-task",
|
||||
"type": "ms.vss-distributed-task.task",
|
||||
"targets": [
|
||||
"ms.vss-distributed-task.tasks"
|
||||
],
|
||||
"properties": {
|
||||
"name": "execute-gitversion"
|
||||
}
|
||||
}]
|
||||
}
|
||||
12
dist/github/execute/index.js
vendored
12
dist/github/execute/index.js
vendored
File diff suppressed because one or more lines are too long
12
dist/github/setup/index.js
vendored
12
dist/github/setup/index.js
vendored
File diff suppressed because one or more lines are too long
1388
package-lock.json
generated
1388
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "use-gitversion",
|
||||
"name": "gittools-actions",
|
||||
"version": "1.0.0",
|
||||
"description": "Easy Semantic Versioning (http://semver.org) for projects using Git",
|
||||
"repository": {
|
||||
@@ -14,7 +14,8 @@
|
||||
"package-azure-setup": "ncc build src/azure/setup.ts -o dist/azure/setup",
|
||||
"package-azure-execute": "ncc build src/azure/execute.ts -o dist/azure/execute",
|
||||
"package-github-setup": "ncc build src/github/setup.ts -o dist/github/setup",
|
||||
"package-github-execute": "ncc build src/github/execute.ts -o dist/github/execute"
|
||||
"package-github-execute": "ncc build src/github/execute.ts -o dist/github/execute",
|
||||
"publish-azure": "tfx extension publish --root ./dist/azure --no-wait-validation --auth-type pat"
|
||||
},
|
||||
"author": "GitTools",
|
||||
"contributors": [
|
||||
@@ -36,6 +37,7 @@
|
||||
"@types/node": "12.12.11",
|
||||
"@types/q": "1.5.2",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"tfx-cli": "0.7.11",
|
||||
"tslint": "^5.20.1",
|
||||
"typescript": "^3.7.2",
|
||||
"@zeit/ncc": "^0.20.5"
|
||||
|
||||
@@ -13,7 +13,6 @@ import { IBuildAgent, IExecResult } from "../interfaces";
|
||||
|
||||
@injectable()
|
||||
class BuildAgent implements IBuildAgent {
|
||||
public Stats;
|
||||
|
||||
public find(toolName: string, versionSpec: string, arch?: string): string {
|
||||
return toolCache.find(toolName, versionSpec, arch);
|
||||
|
||||
Reference in New Issue
Block a user