public void CreateShelveset(bool force = false) { try { if (ProjectCollectionUri == null) { return; } var teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(ProjectCollectionUri); teamProjectCollection.Credentials = CredentialCache.DefaultNetworkCredentials; teamProjectCollection.EnsureAuthenticated(); var service = (VersionControlServer)teamProjectCollection.GetService(typeof(VersionControlServer)); var infos = new AutoShelveInfos(this); foreach (var workspaceInfo in Workstation.Current.GetAllLocalWorkspaceInfo()) { if (workspaceInfo.MappedPaths.Length <= 0 || !workspaceInfo.ServerUri.Equals(ProjectCollectionUri)) { continue; } Task.Run(() => { var result = CreateShelvesetInternal(service, workspaceInfo, infos, force); if (!result.IsSuccess) { InvalidateConnection(); // Force re-init on next attempt } ShelvesetCreated?.Invoke(this, result); }); } } catch (Exception ex) { InvalidateConnection(); // Force re-init on next attempt TfsShelvesetErrorReceived?.Invoke(this, new TfsShelvesetErrorEventArgs(error: ex)); } }
/// <summary> /// /// </summary> /// <param name="service"></param> /// <param name="infos"></param> /// <param name="workspaceInfo"></param> /// <param name="force">True when the user manually initiates a ShelveSet via the Team menu or mapped shortcut key.</param> private static ShelvesetCreatedEventArgs CreateShelvesetInternal(VersionControlServer service, WorkspaceInfo workspaceInfo, AutoShelveInfos infos, bool force) { var shelvesetName = default(string); var shelvesetChangeCount = 0; var shelvesetPurgeCount = 0; var error = default(Exception); try { var workspace = service.GetWorkspace(workspaceInfo); // Build a new, valid shelve set name shelvesetName = string.Format(infos.ShelvesetName, workspace.Name, workspace.OwnerName, DateTime.Now, workspace.OwnerName.GetDomain(), workspace.OwnerName.GetLogin()); shelvesetName = shelvesetName.CleanShelvesetName(); // If there are no pending changes that have changed since the last shelveset then there is nothing to do var hasChanges = force; var pendingChanges = workspace.GetPendingChanges(); var numPending = pendingChanges.Length; if (numPending > 0) { var pastShelvesets = GetPastShelvesets(service, workspace, infos.ShelvesetName); if (!force) { var lastShelveset = pastShelvesets.FirstOrDefault(); if (lastShelveset == null) { // If there are pending changes and no shelveset yet exists, then create shelveset. hasChanges = true; } else { // Compare numPending to shelvedChanges.Count(); Force shelveset if they differ // Otherwise, resort to comparing file HashValues var shelvedChanges = service.QueryShelvedChanges(lastShelveset).FirstOrDefault(); hasChanges = (shelvedChanges == null || numPending != shelvedChanges.PendingChanges.Length) || pendingChanges.DifferFrom(shelvedChanges.PendingChanges); } } if (hasChanges) { shelvesetChangeCount = numPending; // Actually create a new Shelveset var shelveset = new Shelveset(service, shelvesetName, workspace.OwnerName) { Comment = string.Format(Resources.ShelvesetComment, VsExtAutoShelvePackage.ExtensionName, numPending) }; workspace.Shelve(shelveset, pendingChanges, ShelvingOptions.Replace); // Clean up past Shelvesets if (infos.MaximumShelvesets > 0) { foreach (var set in pastShelvesets.Skip(infos.MaximumShelvesets)) { service.DeleteShelveset(set); shelvesetPurgeCount++; } } } } } catch (Exception ex) { error = ex; } // Build event args for notification create shelveset result return(new ShelvesetCreatedEventArgs( shelvesetName: shelvesetName, shelvesetChangeCount: shelvesetChangeCount, shelvesetPurgeCount: shelvesetPurgeCount, error: error)); }