public void CreateShelveset(bool force = false) { try { if (TfsExt == null) return; var domainUri = WebUtility.UrlDecode(_tfsExt.ActiveProjectContext.DomainUri); var teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(domainUri)); teamProjectCollection.Credentials = CredentialCache.DefaultNetworkCredentials; teamProjectCollection.EnsureAuthenticated(); var service = (VersionControlServer)teamProjectCollection.GetService(typeof(VersionControlServer)); var allLocalWorkspaceInfo = Workstation.Current.GetAllLocalWorkspaceInfo(); foreach (var workspaceInfo in allLocalWorkspaceInfo) { // Replace(/,"") before comparing domainUri to prevent: "TFS Auto Shelve shelved 0 pending changes. Shelveset Name: " if (workspaceInfo.MappedPaths.Length <= 0 || workspaceInfo.ServerUri.ToString().Replace("/", string.Empty) != domainUri.Replace("/", string.Empty)) continue; var workspace = service.GetWorkspace(workspaceInfo); CreateShelveset(service, workspace, force); } } catch (Exception ex) { _tfsExt = null; // Force re-init on next attempt if (OnShelvesetCreated != null) { var autoShelveEventArg = new ShelvesetCreatedEventArgs { ExecutionException = ex }; OnShelvesetCreated(this, autoShelveEventArg); } } }
///////////////////////////////////////////////////////////////////////////// // Overridden Package Implementation #region Package Members private void autoShelve_OnShelvesetCreated(object sender, ShelvesetCreatedEventArgs e) { if (e.ExecutionSuccess) { if (e.ShelvesetChangeCount == 0) { //WriteToOutputWindow("."); } else { var str = string.Format("Shelved {0} pending change{1} to Shelveset Name: {2}", e.ShelvesetChangeCount, e.ShelvesetChangeCount != 1 ? "s" : "", e.ShelvesetName); if (e.ShelvesetsPurgeCount > 0) { str += string.Format(" | Maximum Shelvesets: {0} | Deleted: {1}", _autoShelve.MaximumShelvesets, e.ShelvesetsPurgeCount); } WriteToStatusBar(str); WriteLineToOutputWindow(str); } } else { WriteException(e.ExecutionException); } }
/// <summary> /// /// </summary> /// <param name="service"></param> /// <param name="workspace"></param> /// <param name="force">True when the user manually initiates a ShelveSet via the Team menu or mapped shortcut key.</param> private void CreateShelveset(VersionControlServer service, Workspace workspace, bool force) { // Build event args for notification create shelveset result var autoShelveEventArg = new ShelvesetCreatedEventArgs(); try { // If there are no pending changes that have changed since the last shelveset then there is nothing to do bool isDelta = false; var pendingChanges = workspace.GetPendingChanges(); int numPending = pendingChanges.Count(); if (!force && numPending > 0) { // Compare numPending to numItemsShelved; Force shelveset if they differ // Otherwise, resort to comparing file HashValues var lastShelveset = GetPastShelvesets(service, workspace).FirstOrDefault(); var shelvedChanges = service.QueryShelvedChanges(lastShelveset)[0].PendingChanges; int numItemsShelved = lastShelveset == null ? 0 : shelvedChanges.Count(); isDelta = (numPending != numItemsShelved) || pendingChanges.DifferFrom(shelvedChanges); } autoShelveEventArg.ShelvesetChangeCount = (force || isDelta) ? numPending : 0; if (force || isDelta) { // Build a new, valid shelve set name var setname = string.Format(ShelvesetName, workspace.Name, workspace.OwnerName, DateTime.Now, workspace.OwnerName.GetDomain(), workspace.OwnerName.GetLogin()); setname = CleanShelvesetName(setname); // Actually create a new Shelveset var shelveset = new Shelveset(service, setname, workspace.OwnerName); autoShelveEventArg.ShelvesetName = setname; shelveset.Comment = string.Format("Shelved by {0}. {1} items", _extensionName, numPending); workspace.Shelve(shelveset, pendingChanges, ShelvingOptions.Replace); // Clean up past Shelvesets if (MaximumShelvesets > 0) { foreach (var set in GetPastShelvesets(service, workspace).Skip(MaximumShelvesets)) { service.DeleteShelveset(set); autoShelveEventArg.ShelvesetsPurgeCount++; } } } } catch (Exception ex) { _tfsExt = null; // Force re-init on next attempt autoShelveEventArg.ExecutionException = ex; } // Fire event for each VS instance to report results if (OnShelvesetCreated != null) { OnShelvesetCreated(this, autoShelveEventArg); } }