-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Description
Describe the bug
When running on a file system that doesn't support hard linking, the download tool fails.
Related command
az artifacts universal download
Errors
the following error is shown:
Encountered an unexpected error.
System.IO.IOException: Hard linking failed!
Status: FailedSinceNotSupportedByFilesystem
Path: ./PATH/TO/FILE
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClient.DownloadAndHardlinkTempFile(DedupNode node, String fullPath, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClient.DownloadToFileAsync(DedupNode node, String fullPath, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClientWithDataport.DownloadToFileAsync(IDedupDataPort dataport, DedupNode node, String fullPath, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClientWithDataport.DownloadToFileAsync(IDedupDataPort dataport, DedupIdentifier dedupId, String fullPath, UInt64 fileSize, GetDedupAsyncFunc dedupFetcher, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.<>c__DisplayClass31_0.<b__5>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.VisualStudio.Services.Content.Common.NonSwallowingActionBlock.<>c__DisplayClass5_01.<<CreateNonSwallowingFunc>b__0>d.MoveNext() --- End of stack trace from previous location --- at Microsoft.VisualStudio.Services.Content.Common.TargetBlockExtensions.SendAllAndCompleteAsync[T1,T2](ITargetBlock1 targetBlock, IEnumerable1 inputs, ITargetBlock1 finalBlock, CancellationToken token)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.DownloadAsyncWithManifestPath(DownloadDedupManifestArtifactOptions downloadOptions, IEnumerable1 minimatcherFuncs, Boolean downloadManifestReferences, ISet1 excludedPaths, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.DownloadSingleManifestAsync(DownloadDedupManifestArtifactOptions downloadOptions, Boolean downloadManifestReferences, ISet1 excludedPaths, CancellationToken cancellationToken) at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.DownloadAsync(DownloadDedupManifestArtifactOptions downloadOptions, CancellationToken cancellationToken) at Microsoft.VisualStudio.Services.Packaging.UPackClientShared.UPackSharedClient.DownloadAsync(String projectNameOrId, String feedNameOrId, String packageName, String packageVersion, String targetDirectory, IEnumerable1 minimatchPatterns, CancellationToken cancellationToken)
at ArtifactTool.Commands.UPack.UPackDownloadCommandBase.<>c__DisplayClass2_0.<b__0>d.MoveNext() in D:\a_work\1\s\src\ArtifactTool\Commands\UPack\UPackDownloadCommandBase.cs:line 26
--- End of stack trace from previous location ---
at ArtifactTool.Commands.UPack.UPackExceptionMapper.WithExceptionHandlingAsync(Func1 act) in D:\a\_work\1\s\src\ArtifactTool\Commands\UPack\UPackExceptionMapper.cs:line 39 at ArtifactTool.Commands.UPack.UPackDownloadCommandBase.DownloadPackageAsync(UPackSinglePackageDownloadRequest request) in D:\a\_work\1\s\src\ArtifactTool\Commands\UPack\UPackDownloadCommandBase.cs:line 23 at ArtifactTool.Commands.UPackDownloadCommand.ExecuteAsync() in D:\a\_work\1\s\src\ArtifactTool\Commands\UPack\UPackDownloadCommand.cs:line 41 at ArtifactTool.Commands.CommandBase.OnExecuteAsync() in D:\a\_work\1\s\src\ArtifactTool\Commands\CommandBase.cs:line 105 at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.InvokeAsync(MethodInfo method, Object instance, Object[] arguments) in C:\projects\commandlineutils\src\CommandLineUtils\Conventions\ExecuteMethodConvention.cs:line 77 at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.OnExecute(ConventionContext context) in C:\projects\commandlineutils\src\CommandLineUtils\Conventions\ExecuteMethodConvention.cs:line 62 at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.<>c__DisplayClass0_0.<<Apply>b__0>d.MoveNext() in C:\projects\commandlineutils\src\CommandLineUtils\Conventions\ExecuteMethodConvention.cs:line 25 --- End of stack trace from previous location --- at McMaster.Extensions.CommandLineUtils.CommandLineApplication.<>c__DisplayClass126_0.<OnExecute>b__0() in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.cs:line 505 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.cs:line 611 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.Execute[TApp](CommandLineContext context) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 57 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync[TApp](CommandLineContext context) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 145 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync[TApp](IConsole console, String[] args) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 130 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync[TApp](String[] args) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 112 at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span1 copyOfArgs, BindingFlags invokeAttr)
Process ['C:\Users\USER\.azure\azuredevops\cli\tools\artifacttool\ArtifactTool_win-x64_0.2.508\artifacttool', 'universal', 'download', '--service', 'https://dev.azure.com/ORG/', '--patvar', 'AZURE_DEVOPS_EXT_ARTIFACTTOOL_PATVAR', '--feed', 'FEED', '--package-name', 'PACKAGE', '--package-version', 'VERSION', '--path', './PATH', '--project', 'PROJECT'] with PID 6112 exited with return code 1
Issue script & Debug output
az_command_data_logger: command args: artifacts universal download --organization={} --project={} --scope={} --feed={} --name={} --version={} --path={} --d
ebug
cli.knack.cli: Event: CommandInvoker.OnPreArgumentLoad [<function register_global_subscription_argument..add_subscription_parameter at 0x03E7E848>]
cli.knack.cli: Event: CommandInvoker.OnPostArgumentLoad []
cli.knack.cli: Event: CommandInvoker.OnPostCommandTableCreate [<function register_ids_argument..add_ids_arguments at 0x03E94AC8>, <function registe
r_cache_arguments..add_cache_arguments at 0x03E94BB8>, <function register_upcoming_breaking_change_info..update_breaking_change_info at 0x0
3E94C08>]
cli.knack.cli: Event: CommandInvoker.OnCommandTableLoaded []
cli.knack.cli: Event: CommandInvoker.OnPreParseArgs []
cli.knack.cli: Event: CommandInvoker.OnPostParseArgs [<function OutputProducer.handle_output_argument at 0x0207B168>, <function CLIQuery.handle_query_param
eter at 0x0209B348>, <function register_ids_argument..parse_ids_arguments at 0x03E94B18>, <function DevCommandsLoader.post_parse_args at 0x03EBBDE8
]
az_command_data_logger: extension name: azure-devops
az_command_data_logger: extension version: 1.0.2
Expected behavior
download to succeed
Environment Summary
azure-cli 2.81.0
core 2.81.0
telemetry 1.1.0
Extensions:
azure-devops 1.0.2
Dependencies:
msal 1.34.0b1
azure-mgmt-resource 23.3.0
Python location 'C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe'
Config directory 'C:\Users\USER.azure'
Extensions directory 'C:\Users\USER.azure\cliextensions'
Python (Windows) 3.13.9 (tags/v3.13.9:8183fa5, Oct 14 2025, 14:00:05) [MSC v.1944 32 bit (Intel)]
Legal docs and information: aka.ms/AzureCliLegal
Your CLI is up-to-date.
Additional context
No response