private static string GetAccountNameForCredentialQuery(InputArguments input) { if (!input.TryGetHostAndPort(out string hostName, out _)) { throw new InvalidOperationException("Failed to parse host name and/or port"); } // dev.azure.com if (UriHelpers.IsDevAzureComHost(hostName)) { // We ignore the given username for dev.azure.com-style URLs because AzDevOps recommends // adding the organization name as the user in the remote URL (resulting in URLs like // https://[email protected]/org/foo/_git/bar) and we don't know if the given username // is an actual username, or the org name. // Use `null` as the account name so we match all possible credentials (regardless of // the account). return(null); } // *.visualstudio.com if (UriHelpers.IsVisualStudioComHost(hostName)) { // If we're given a username for the vs.com-style URLs we can and should respect any // specified username in the remote URL/input arguments. return(input.UserName); } throw new InvalidOperationException("Host is not Azure DevOps."); }
/// <remarks> /// For dev.azure.com-style URLs we use the path arg to get the Azure DevOps organization name. /// We ensure the presence of the path arg by setting credential.useHttpPath = true at install time. /// /// The result of this workaround is that we are now unable to determine if the user wanted to store /// credentials with the full path or not for dev.azure.com-style URLs. /// /// Rather than always assume we're storing credentials against the full path, and therefore resulting /// in an personal access token being created per remote URL/repository, we never store against /// the full path and always store with the organization URL "dev.azure.com/org". /// /// For visualstudio.com-style URLs we know the AzDevOps organization name from the host arg, and /// don't set the useHttpPath option. This means if we get the full path for a vs.com-style URL /// we can store against the full remote path (the intended design). /// /// Users that need to clone a repository from Azure Repos against the full path therefore must /// use the vs.com-style remote URL and not the dev.azure.com one. /// </remarks> private static string GetServiceName(InputArguments input) { if (!input.TryGetHostAndPort(out string hostName, out _)) { throw new InvalidOperationException("Failed to parse host name and/or port"); } // dev.azure.com if (UriHelpers.IsDevAzureComHost(hostName)) { // We can never store the new dev.azure.com-style URLs against the full path because // we have forced the useHttpPath option to true to in order to retrieve the AzDevOps // organization name from Git. return(UriHelpers.CreateOrganizationUri(input).AbsoluteUri.TrimEnd('/')); } // *.visualstudio.com if (UriHelpers.IsVisualStudioComHost(hostName)) { // If we're given the full path for an older *.visualstudio.com-style URL then we should // respect that in the service name. return(input.GetRemoteUri().AbsoluteUri.TrimEnd('/')); } throw new InvalidOperationException("Host is not Azure DevOps."); }
/// <remarks> /// For dev.azure.com-style URLs we use the path arg to get the Azure DevOps organization name. /// We ensure the presence of the path arg by setting credential.useHttpPath = true at install time. /// /// The result of this workaround is that we are now unable to determine if the user wanted to store /// credentials with the full path or not for dev.azure.com-style URLs. /// /// Rather than always assume we're storing credentials against the full path, and therefore resulting /// in an personal access token being created per remote URL/repository, we never store against /// the full path and always store with the organization URL "dev.azure.com/org". /// /// For visualstudio.com-style URLs we know the AzDevOps organization name from the host arg, and /// don't set the useHttpPath option. This means if we get the full path for a vs.com-style URL /// we can store against the full remote path (the intended design). /// /// Users that need to clone a repository from Azure Repos against the full path therefore must /// use the vs.com-style remote URL and not the dev.azure.com one. /// </remarks> private static string GetServiceName(Uri remoteUri) { // dev.azure.com if (UriHelpers.IsDevAzureComHost(remoteUri.Host)) { // We can never store the new dev.azure.com-style URLs against the full path because // we have forced the useHttpPath option to true to in order to retrieve the AzDevOps // organization name from Git. return(UriHelpers.CreateOrganizationUri(remoteUri, out _).AbsoluteUri.TrimEnd('/')); } // *.visualstudio.com if (UriHelpers.IsVisualStudioComHost(remoteUri.Host)) { // If we're given the full path for an older *.visualstudio.com-style URL then we should // respect that in the service name. return(remoteUri.AbsoluteUri.TrimEnd('/')); } throw new InvalidOperationException("Host is not Azure DevOps."); }