Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
639af91
Add --check-version flag (#3173)
wonwuakpa-msft Sep 18, 2025
0acf549
Add WSAETIMEDOUT to list (#3195)
adreed-msft Sep 22, 2025
2b91a8e
Correct incorrect folder tracker behavior (#3151)
adreed-msft Sep 23, 2025
01b2ad7
Implement request priority policy (#3162)
adreed-msft Sep 24, 2025
48ed131
Redact x-ams-credential from logs (#3206)
wonwuakpa-msft Sep 25, 2025
c18bbc6
Backward compatibility with older az accounts with AsSecureString (#3…
wonwuakpa-msft Sep 26, 2025
a9d3f7e
Fix symlink direct targets (#3222)
adreed-msft Sep 30, 2025
491d22f
Phase-2: Support for SMB<->NFS and symlink for Azure Files NFS (#3239)
dphulkar-msft Oct 6, 2025
73db671
Updated ChangeLog with NFS Phase-2 features (#3240)
dphulkar-msft Oct 7, 2025
ec6313b
Catch EADDRNOTAVAILABLE (#3237)
adreed-msft Oct 7, 2025
5b4e608
Fix a bug with remove decoding special chars (#3232)
wonwuakpa-msft Oct 9, 2025
1b6b42b
Job resume command not printing job summary (#3103)
anu-avocado Oct 13, 2025
8d997ff
Fix error with FileBlob OAuth failing (#3250)
wonwuakpa-msft Oct 13, 2025
56174cf
Refactor platform retry policy (#3252)
adreed-msft Oct 14, 2025
d698076
Removed website and redirect to wiki (#3244)
derdanu Oct 14, 2025
fd70daa
Refactored and reorganized traverser code (#3251)
gapra-msft Oct 15, 2025
2fa7694
Change run_scenarios.yml to use azcli federated credential instead of…
dphulkar-msft Oct 15, 2025
5cae524
Extend --include-root flag to include root props for Sync (#3163)
wonwuakpa-msft Oct 16, 2025
e392709
Refactored credential code and removed dead code (#3260)
gapra-msft Oct 17, 2025
d700590
Moved LCM to cmd folder (#3262)
gapra-msft Oct 21, 2025
b20143a
Remove duplicate directory creation to fix test flakiness (#3265)
wonwuakpa-msft Oct 22, 2025
e21da6c
10.31.0 release (#3264)
gapra-msft Oct 23, 2025
edd48be
ga version update (#3268)
gapra-msft Oct 24, 2025
e359377
Fixed a bug where througput was not being displayed for copy and resu…
gapra-msft Nov 7, 2025
4c1abd0
Migrated login, login status and logout to library (#3266)
gapra-msft Nov 10, 2025
6e46576
Upgraded go version and AzCopy version (#3274)
gapra-msft Nov 11, 2025
5a7ad77
Fixed panic for s3 and gcp transfers (#3276)
gapra-msft Nov 12, 2025
77d4cf3
Add missing stage in 1ES pipeline, label release jobs correctly (#3233)
wonwuakpa-msft Nov 13, 2025
6f078bc
Migrated resume code (#3289)
gapra-msft Nov 18, 2025
a0712a6
Cleanup before sync migration (#3292)
gapra-msft Nov 20, 2025
d083a61
Migrated sync code (#3293)
gapra-msft Nov 24, 2025
a7f6c74
Cleanup before copy migration (#3301)
gapra-msft Nov 25, 2025
ffcdb9e
Migrated copy code (#3310)
gapra-msft Dec 4, 2025
4540245
Progress and result summary logging to happen in library (#3315)
gapra-msft Jan 7, 2026
6f29fab
Allow copies with leading slash or no name virtual dirs (#3294)
wonwuakpa-msft Jan 9, 2026
3bcd1ea
Porting over changes from 10.31.1 patch release (#3332)
gapra-msft Jan 12, 2026
029a164
Added changelog entry for 10.32.0 preview 1 (#3337)
gapra-msft Jan 13, 2026
1da07e7
hdi_isfolder shall always be set in lower case on backend (#3312)
bhansalivikas Jan 14, 2026
3441066
Added safeguards around release pipeline (#3296)
wonwuakpa-msft Jan 14, 2026
7a8afc0
Fix benchmark command typo (#3328)
gapra-msft Jan 14, 2026
8b21e26
Correct bug where network errors would not be retried on (#3338)
gapra-msft Jan 15, 2026
2c01b46
Apply service side prefiltering to azure files (#3279)
adreed-msft Jan 15, 2026
21c08ef
Fix system or event logging (#3339)
wonwuakpa-msft Jan 16, 2026
80aaf0b
Updated Wiki Format (#3311)
derdanu Jan 16, 2026
10c1412
Update README.md to clarify supported directions and authorization me…
derdanu Jan 17, 2026
c5089be
Add support for AMLFS style posix metadata (#3317)
wonwuakpa-msft Jan 20, 2026
2c4e14a
Avoid re-creating pre-existing folders. (#3295)
adreed-msft Jan 23, 2026
8293e04
Changelog and version bump (#3351)
gapra-msft Jan 27, 2026
6d12fbd
wildcard list of files fix for uploads and downloads (#3355)
gapra-msft Jan 30, 2026
de80e50
StgExp bug with --put-md5 (#3358)
wonwuakpa-msft Feb 4, 2026
2156857
Merge remote-tracking branch 'openshift/release-5.0' into rebase-v10.…
RomanBednar Feb 16, 2026
c82f780
UPSTREAM: <carry>: Add OpenShift files
RomanBednar Feb 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
90 changes: 84 additions & 6 deletions ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,91 @@

# Change Log

## Version 10.32.0

### New Features
1. Added support for AMLFS style posix metadata. ([#3317](https://github.com/Azure/azure-storage-azcopy/pull/3317))

### Bug Fixes
1. Fixed a bug where hdi_isfolder metadata key would sometimes not be sent in all lowercase, resulting in unexpected behavior on the service side when fetching properties. ([#3312](https://github.com/Azure/azure-storage-azcopy/pull/3312))
2. Fixed a typo in the `benchmark` command, to allow the `--put-md5` flag to work. ([#3324](https://github.com/Azure/azure-storage-azcopy/issues/3324))
3. Fixed a bug where network errors would not be retried on. ([#3338](https://github.com/Azure/azure-storage-azcopy/pull/3338))
4. Fixed a bug where unexpected requests would be logged in syslog. ([#3339](https://github.com/Azure/azure-storage-azcopy/pull/3339))
5. Fixed a bug where pre-existing folders would be recreated. ([#3295](https://github.com/Azure/azure-storage-azcopy/pull/3295))

### Documentation
1. Updated README to clarify supported source-destination pairs and authorization mechanisms. ([#3213](https://github.com/Azure/azure-storage-azcopy/pull/3213))
2. Updated format of wiki generated docs to improve readability. ([#3311](https://github.com/Azure/azure-storage-azcopy/pull/3311))

### Breaking changes
1. AzCopy download URLs starting with https://azcopyvnext-awgzd8g7aagqhzhe.b02.azurefd.net/ are no longer supported.
Please download AzCopy from the official GitHub Releases page instead.
If you rely on an older AzCopy version that is not available on GitHub, please open an issue in the AzCopy repository and request that it be added.

## Version 10.32.0-preview.1

### Bug Fixes
1. Fixed a bug where throughput was not being displayed for copy and resume. ([#3271](https://github.com/Azure/azure-storage-azcopy/issues/3271))
2. Fixed a bug where S3 and GCP transfers would panic. ([#3273](https://github.com/Azure/azure-storage-azcopy/issues/3273))

### Code Improvements
1. Refactored [copy](https://github.com/Azure/azure-storage-azcopy/pull/3310), [sync](https://github.com/Azure/azure-storage-azcopy/pull/3293), [resume](https://github.com/Azure/azure-storage-azcopy/pull/3289), [login, logout, login status](https://github.com/Azure/azure-storage-azcopy/pull/3266) business logic into the azcopy package.

## Version 10.31.1

### Dependency updates
1. Golang 1.24.6 -> 1.24.11
2. golang.org/x/crypto 0.40.0 -> 0.45.0

## Version 10.31.0

### New Features
1. `--include-root` flag now allows customers to preserve root properties when used in conjunction with `--preserve-XXXX` flags. ([#3163](https://github.com/Azure/azure-storage-azcopy/pull/3163))

### Bug Fixes
1. Fixed a bug to retry on various network errors. ([#3237](https://github.com/Azure/azure-storage-azcopy/pull/3237])) ([#3252](https://github.com/Azure/azure-storage-azcopy/pull/3252))
2. Fixed a bug where remove would not work on paths with encoded characters. ([#2977](https://github.com/Azure/azure-storage-azcopy/issues/2977))
3. Fixed a bug where jobs resume would not produce any output for previously failed jobs. ([#3103](https://github.com/Azure/azure-storage-azcopy/pull/3103))
4. Fixed a bug where FileBlob transfers with EntraID on the source would pass the wrong service version. ([#3242](https://github.com/Azure/azure-storage-azcopy/issues/3242))

## Code Improvements
1. Refactored traverser related code into its own package. ([#3251](https://github.com/Azure/azure-storage-azcopy/pull/3251))
2. Refactored OAuth token manager access to use a client-based pattern instead of global singleton access. ([#3260](https://github.com/Azure/azure-storage-azcopy/pull/3260))
3. Removed unused code related to credential management. ([#3260](https://github.com/Azure/azure-storage-azcopy/pull/3260))
4. Refactored Lifecycle UI code into the cmd package ([#3262](https://github.com/Azure/azure-storage-azcopy/pull/3262)).
5. Error handling code is now injected into JobMgr, or appropriately bubbled upwards instead of using global LCM error handling. ([#3262](https://github.com/Azure/azure-storage-azcopy/pull/3262))

## Version 10.31.0-preview.1

### Dependency updates
1. Golang 1.24.4 -> 1.24.6 ([#3154](https://github.com/Azure/azure-storage-azcopy/issues/3154))

### New Features
1. Azure Files NFS -> Azure Files SMB transfers.
- Transfer from Azure Files NFS to Azure Files SMB. (`--from-to=FileNFSFileSMB`)
2. Azure Files SMB -> Azure Files NFS transfers.
- Transfer from Azure Files SMB to Azure Files NFS. (`--from-to=FileSMBFileNFS`)
3. Symlink support for Azure Files NFS shares.
Introduced support for symbolic links in Azure Files NFS shares.
Symlinks can be preserved, skipped, or followed based on command-line flags.
- Preserve symlinks: `--preserve-symlinks=true`
- Skip symlinks: default behavior when flags are not provided
- Follow symlinks: `--follow-symlinks=true`
4. Added a --check-version flag to make version checking an opt in feature. ([#3173](https://github.com/Azure/azure-storage-azcopy/pull/3173))

### Bug Fixes
1. Fixed a bug to retry on WSAETIMEDOUT on Windows. ([#3195](https://github.com/Azure/azure-storage-azcopy/pull/3195))
2. Fixed a bug with the folder creation tracker which caused folder creation calls to happen more often than necessary. ([#3151](https://github.com/Azure/azure-storage-azcopy/pull/3151))
3. Fixed a bug to redact x-ams-credential from logs. ([#3206](https://github.com/Azure/azure-storage-azcopy/pull/3206))
4. Fixed a bug where powershell login would fail with older versions of Az.Accounts. ([#3191](https://github.com/Azure/azure-storage-azcopy/pull/3191))
5. Fixed a bug where symlink direct targets would be handled as a file instead of a symlink. ([#3222](https://github.com/Azure/azure-storage-azcopy/pull/3222))

### Breaking changes
1. AzCopy no longer checks version by default. ([#3173](https://github.com/Azure/azure-storage-azcopy/pull/3173))

## Version 10.30.1

### Bug Fixes
### Bug Fixes
1. Fixed `--exclude-path` flag not available in remove operations.([PR #3165](https://github.com/Azure/azure-storage-azcopy/pull/3165)) ([GH Issue #3159](https://github.com/Azure/azure-storage-azcopy/issues/3159))
2. Fixed regression where AzCopy was not honoring concurrency value in copy operations ([#3192](https://github.com/Azure/azure-storage-azcopy/pull/3192))
3. Fixed the incorrect JSON output format of the warning message when there are multiple AzCopy processes running. ([PR #3188](https://github.com/Azure/azure-storage-azcopy/pull/3188)) ([GH Issue #3182](https://github.com/Azure/azure-storage-azcopy/issues/3182))
Expand All @@ -13,11 +95,6 @@
### Dependency Updates
1. Golang 1.24.2 -> 1.24.6 (CVE-2025-47907) ([#3154](https://github.com/Azure/azure-storage-azcopy/issues/3154))

## Version 10.31.0-preview.1

### Dependency updates
1. Golang 1.24.4 -> 1.24.6 ([#3154](https://github.com/Azure/azure-storage-azcopy/issues/3154))

## Version 10.30.0
### Breaking changes
1. For transfers involving Azure Files (NFS or SMB), AzCopy will not auto create file shares.
Expand Down Expand Up @@ -1246,3 +1323,4 @@ information, including those needed to set the new headers.
1. excludedBlobType -> excluded-blob-type
1. outputRaw (in "list" command) -> output
1. stdIn-enable (reserved for internal use) -> stdin-enable

55 changes: 36 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,25 +62,42 @@ The general format of the AzCopy commands is: `azcopy [command] [arguments] --[f

* `bench` - Runs a performance benchmark by uploading or downloading test data to or from a specified destination

* `copy` - Copies source data to a destination location. The supported directions are:
- Local File System <-> Azure Blob (SAS or OAuth authentication)
- Local File System <-> Azure Files (Share/directory SAS or OAuth authentication)
- Local File System <-> Azure Data Lake Storage (ADLS Gen2) (SAS, OAuth, or SharedKey authentication)
- Azure Blob (SAS, OAuth or public authentication) -> Azure Blob (SAS or OAuth authentication)
- Azure Blob (SAS, OAuth or public authentication) -> Azure Files (SAS or OAuth authentication)
- Azure Files (SAS or OAuth authentication) -> Azure Files (SAS or OAuth authentication)
- Azure Files (SAS or OAuth authentication) -> Azure Blob (SAS or OAuth authentication)
- AWS S3 (Access Key) -> Azure Block Blob (SAS or OAuth authentication)
- Google Cloud Storage (Service Account Key) -> Azure Block Blob (SAS or OAuth authentication) [Preview]

* `sync` - Replicate source to the destination location. The supported directions are:
- Local File System <-> Azure Blob (SAS or OAuth authentication)
- Local File System <-> Azure Files (Share/directory SAS or OAuth authentication)
- Azure Blob (SAS, OAuth or public authentication) -> Azure Files (SAS or OAuth authentication)

* `login` - Log in to Azure Active Directory (AD) to access Azure Storage resources.

* `logout` - Log out to terminate access to Azure Storage resources.
* `copy` - Copies source data to a destination location. The supported directions and forms of authorization are:
Source | Destination
--- | ---
Local | Azure Blob (Microsoft Entra ID or SAS)
Local | Azure Files SMB (Microsoft Entra ID or share/directory SAS)
Local | Azure Files NFS (Microsoft Entra ID or share/directory SAS)
Local | Azure Data Lake Storage (Microsoft Entra ID, SAS, or Shared Key)
Azure Blob (Microsoft Entra ID or SAS) | Local
Azure Files SMB (Microsoft Entra ID or share/directory SAS) | Local
Azure Files NFS (Microsoft Entra ID or share/directory SAS) | Local
Azure Data Lake Storage (Microsoft Entra ID, SAS, or Shared Key) | Local
Azure Blob (Microsoft Entra ID, SAS, or public) | Azure Blob (Microsoft Entra ID or SAS)
Azure Blob (Microsoft Entra ID, SAS, or public) | Azure Files SMB (Microsoft Entra ID or SAS)
Azure Blob (Microsoft Entra ID or SAS) | Azure Data Lake Storage (Microsoft Entra ID or SAS)
Azure Data Lake Storage (Microsoft Entra ID or SAS) | Azure Blob (Microsoft Entra ID or SAS)
Azure Data Lake Storage (Microsoft Entra ID or SAS) | Azure Data Lake Storage (Microsoft Entra ID or SAS)
Azure Files SMB (Microsoft Entra ID or SAS) | Azure Blob (Microsoft Entra ID or SAS)
Azure Files SMB (Microsoft Entra ID or SAS) | Azure Files SMB (Microsoft Entra ID or SAS)
Azure Files NFS (Microsoft Entra ID or SAS) | Azure Files NFS (Microsoft Entra ID or SAS)
AWS S3 (Access Key) | Azure Block Blob (Microsoft Entra ID or SAS)
Google Cloud Storage (Service Account Key) | Azure Block Blob (Microsoft Entra ID or SAS)

* `sync` - Replicate source to the destination location. The supported directions and forms of authorization are:
Source | Destination
--- | ---
Local | Azure Blob (Microsoft Entra ID or SAS)
Local | Azure File (Microsoft Entra ID or SAS)
Azure Blob (Microsoft Entra ID or SAS) | Local
Azure File (Microsoft Entra ID or SAS) | Local
Azure Blob (Microsoft Entra ID or SAS) | Azure Blob (Microsoft Entra ID or SAS)
Azure Blob (Microsoft Entra ID or SAS) | Azure File (Microsoft Entra ID or SAS)
Azure Data Lake Storage (Microsoft Entra ID or SAS) | Azure Data Lake Storage (Microsoft Entra ID or SAS)
Azure File (Microsoft Entra ID or SAS) | Azure Blob (Microsoft Entra ID or SAS)
Azure File (SAS or public) | Azure File (SAS)

* `login` - Log in to Azure Active Directory (AD) to access Azure Storage resources.* `logout` - Log out to terminate access to Azure Storage resources.

* `list` - List the entities in a given resource

Expand Down
71 changes: 66 additions & 5 deletions azcopy/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,54 @@
package azcopy

import (
"log"
"runtime"

"github.com/Azure/azure-storage-azcopy/v10/common"
"github.com/Azure/azure-storage-azcopy/v10/jobsAdmin"
"github.com/Azure/azure-storage-azcopy/v10/ste"
"log"
"runtime"
)

const (
oauthLoginSessionCacheKeyName = "AzCopyOAuthTokenCache"
oauthLoginSessionCacheServiceName = "AzCopyV10"
oauthLoginSessionCacheAccountName = "AzCopyOAuthTokenCache"
)

const (
// Base10Mega For networking throughput in Mbps, (and only for networking), we divide by 1000*1000 (not 1024 * 1024) because
// networking is traditionally done in base 10 units (not base 2).
// E.g. "gigabit ethernet" means 10^9 bits/sec, not 2^30. So by using base 10 units
// we give the best correspondence to the sizing of the user's network pipes.
// See https://networkengineering.stackexchange.com/questions/3628/iec-or-si-units-binary-prefixes-used-for-network-measurement
// NOTE that for everything else in the app (e.g. sizes of files) we use the base 2 units (i.e. 1024 * 1024) because
// for RAM and disk file sizes, it is conventional to use the power-of-two-based units.
Base10Mega = 1000 * 1000
)

// It's not pretty that this one is read directly by credential util.
// But doing otherwise required us passing it around in many places, even though really
// it can be thought of as an "ambient" property. That's the (weak?) justification for implementing
// it as a global
var TrustedSuffixes string

type Client struct {
CurrentJobID common.JobID // TODO (gapra): In future this should only be set when there is a current job running. On complete, this should be cleared. It can also behave as something we can check to see if a current job is running
CurrentJobID common.JobID // TODO (gapra): In future this should only be set when there is a current job running. On complete, this should be cleared. It can also behave as something we can check to see if a current job is running
oauthTokenManager *common.UserOAuthTokenManager // OAuth token manager for the current user, used for authentication
logLevel common.LogLevel
}

type ClientOptions struct {
CapMbps float64
CapMbps float64
TrustedSuffixes string
LogLevel *common.LogLevel
}

func NewClient(opts ClientOptions) (Client, error) {
c := Client{}
c := Client{
logLevel: common.IffNil(opts.LogLevel, common.ELogLevel.Info()), // Default: Info
}
TrustedSuffixes = opts.TrustedSuffixes
common.InitializeFolders()
configureGoMaxProcs()
// Perform os specific initialization
Expand All @@ -51,9 +82,33 @@ func NewClient(opts ClientOptions) (Client, error) {
if err != nil {
return c, err
}
// only one UserOAuthTokenManager should exist in azcopy process for current user.
// (a given AzcopyJobPlanFolder is mapped to current user)
if common.AzcopyJobPlanFolder == "" {
panic("invalid state, AzcopyJobPlanFolder should not be an empty string")
}
cacheName := common.GetEnvironmentVariable(common.EEnvironmentVariable.LoginCacheName())

c.oauthTokenManager = common.NewUserOAuthTokenManagerInstance(common.CredCacheOptions{
DPAPIFilePath: common.AzcopyJobPlanFolder,
KeyName: common.Iff(cacheName != "", cacheName, oauthLoginSessionCacheKeyName),
ServiceName: oauthLoginSessionCacheServiceName,
AccountName: common.Iff(cacheName != "", cacheName, oauthLoginSessionCacheAccountName),
})
return c, nil
}

// GetUserOAuthTokenManagerInstance gets or creates OAuthTokenManager for current user.
// Note: Currently, only support to have TokenManager for one user mapping to one tenantID.
func (c *Client) GetUserOAuthTokenManagerInstance() *common.UserOAuthTokenManager {
return c.oauthTokenManager
}

// GetLogLevel returns the log level of the client.
func (c *Client) GetLogLevel() common.LogLevel {
return c.logLevel
}

// Ensure we always have more than 1 OS thread running goroutines, since there are issues with having just 1.
// (E.g. version check doesn't happen at login time, if have only one go proc. Not sure why that happens if have only one
// proc. Is presumably due to the high CPU usage we see on login if only 1 CPU, even tho can't see any busy-wait in that code)
Expand All @@ -63,3 +118,9 @@ func configureGoMaxProcs() {
runtime.GOMAXPROCS(2)
}
}

// JobContext contains initialization context for a job.
type JobContext struct {
JobID common.JobID
LogPath string
}
Loading