예제 #1
0
 public Workspace CreateWorkSpace(VersionControlServer vcs, string wsName)
 {
     try
     {
         if (vcs.DeleteWorkspace(wsName, vcs.AuthorizedUser))
         {
             $"Successfully deleted workspace {wsName}".Info();
         }
     }
     catch (Exception e)
     {
         $"createWorkspace: {e.Message}".Error();
     }
     try
     {
         var options = new CreateWorkspaceParameters(wsName)
         {
             WorkspaceOptions = WorkspaceOptions.None,
             OwnerName        = vcs.AuthorizedUser,
             Location         = WorkspaceLocation.Server
         };
         var workSpace = vcs.CreateWorkspace(options);
         $"Workspace created: {workSpace.Name}".Trace();
         return(workSpace);
     }
     catch (Exception e)
     {
         $"createWorkspace: {e.Message}".Error();
         throw;
     }
 }
예제 #2
0
        public static Workspace CreateWorkspace(VersionControlServer versionControlServer, string name, string owner, string comment)
        {
            CreateWorkspaceParameters createWorkspaceParameters = new CreateWorkspaceParameters(name);

            createWorkspaceParameters.Location  = WorkspaceLocation.Server;
            createWorkspaceParameters.OwnerName = owner;
            createWorkspaceParameters.Comment   = comment;
            return(versionControlServer.CreateWorkspace(createWorkspaceParameters));
        }
        internal static Workspace WorkspaceCreate(VersionControlServer vcs, string tfsProject, string workspaceName, string localWorkspaceFolder)
        {
            var workspaceParams = new CreateWorkspaceParameters(workspaceName)
            {
                Computer = Environment.MachineName,
                Folders  = new[]
                {
                    new WorkingFolder(string.Format(@"$/{0}", tfsProject), localWorkspaceFolder)
                },
                Location         = Microsoft.TeamFoundation.VersionControl.Common.WorkspaceLocation.Local,
                OwnerDisplayName = Environment.UserName
            };

            return(vcs.CreateWorkspace(workspaceParams));
        }
예제 #4
0
        private void DoFullGet()
        {
            try
            {
#if DEBUG
                Thread.Sleep(5000);
#endif
                Configuration = new Config();
                Configuration.Init();
                var cts = new CancellationTokenSource();
                $"Get info for all TPCs and all projects".Info();
                var sw = new Stopwatch();
                sw.Start();
                var lpc = GetTeamProjectCollections().AsParallel();
                Func <TfsTeamProjectCollection, string> workspaceName = projColl =>
                {
                    var str = $"{Guid.NewGuid()}_{projColl.GetProjectCollectionName()}";
                    $"workspaceName: {str}".Trace();
                    return(str);
                };
                Func <VersionControlServer, string, Workspace> createWorkSpace = (vcs,
                                                                                  wsName) =>
                {
                    try
                    {
                        if (vcs.DeleteWorkspace(wsName, vcs.AuthorizedUser))
                        {
                            // TODO log
                        }
                    }
                    catch (Exception e)
                    {
                        $"createWorkspace: {e.Message}".Error();
                    }
                    try
                    {
                        var options = new CreateWorkspaceParameters(wsName)
                        {
                            WorkspaceOptions = WorkspaceOptions.None,
                            OwnerName        = vcs.AuthorizedUser,
                            Location         = WorkspaceLocation.Server
                        };
                        var workSpace = vcs.CreateWorkspace(options);
                        $"Workspace created: {workSpace.Name}".Trace();
                        return(workSpace);
                    }
                    catch (Exception e)
                    {
                        $"createWorkspace: {e.Message}".Error();
                        throw;
                    }
                };

                Action <TfsTeamProjectCollection> dropWorkspaces = collection =>
                {
                    try
                    {
                        var vcs = collection.GetService <VersionControlServer>();
                        var wss = vcs.QueryWorkspaces(null, vcs.AuthorizedUser, Environment.MachineName);
                        foreach (var workspace in wss)
                        {
                            if (!workspace.Delete())
                            {
                                $"Failed to delete {workspace.Name}".Error();
                            }
                            else
                            {
                                $"Deleted {workspace.Name}".Info();
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        e.Error();
                        throw;
                    }
                };

                Action <TfsTeamProjectCollection> dropMappings = (collection) =>
                {
                    try
                    {
                        var vcs       = collection.GetService <VersionControlServer>();
                        var wss       = vcs.QueryWorkspaces(null, vcs.AuthorizedUser, null);
                        var localPath = collection.GetProjectCollectionLocalPath(Globals.TfsRoot);
                        var withPath  = wss.Select(workspace => Tuple.Create(workspace, workspace.TryGetWorkingFolderForServerItem(collection.Uri.AbsoluteUri)));
                        foreach (var tuple in withPath)
                        {
                            if (tuple.Item1 != null && tuple.Item2 != null)
                            {
                                $"Dropping {tuple.Item2.LocalItem} for workspace {tuple.Item1.Name}".Info();
                                tuple.Item1.DeleteMapping(tuple.Item2);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        e.Error();
                    }
                };

                Func <Workspace, TfsTeamProjectCollection, Workspace> mapWorkspace = (ws,
                                                                                      pc) =>
                {
                    try
                    {
                        var serverPath = "$/";
                        var localPath  = pc.GetProjectCollectionLocalPath(Globals.TfsRoot);
                        $"mapWorkspace: {nameof(serverPath)} = {serverPath}".Trace();
                        $"mapWorkspace: {nameof(localPath)} = {localPath}".Trace();
                        var vcs = pc.GetService <VersionControlServer>();
                        var lws = Workstation.Current.RemoveCachedWorkspaceInfo(vcs);
                        var wss = vcs.QueryWorkspaces(null, vcs.AuthorizedUser, null);
                        foreach (var workspace in wss)
                        {
                            $"Checking workspace {workspace.Name} for mapping of local path {localPath}".Info();
                            if (workspace.IsLocalPathMapped(localPath))
                            {
                                var wf = workspace.TryGetWorkingFolderForLocalItem(localPath);
                                workspace.DeleteMapping(wf);
                                $"Deleted {localPath} mapping from workspace {workspace.Name}".Info();
                            }
                        }

                        ws.Map(serverPath, localPath);
                        return(ws);
                    }
                    catch (Exception e)
                    {
                        e.Error();
                    }
                    return(null);
                };

                // get the workspaces for this user on this machine and their working folders, if any, for the project collection they belong to
                var pcsAndAllTheirWorkspaces =
                    from pc in lpc.AsParallel()
                    let vcs = pc.GetService <VersionControlServer>()
                              let localPath = pc.GetProjectCollectionLocalPath(Globals.TfsRoot)
                                              select new
                {
                    LocalPath                     = localPath,
                    VersionControlServer          = vcs,
                    ProjectCollection             = pc,
                    WorkspaceAndWorkingFolderList = vcs
                                                    .QueryWorkspaces(null, vcs.AuthorizedUser, null)
                                                    .Where(workspace => workspace.Computer.Equals(Environment.MachineName, StringComparison.OrdinalIgnoreCase))
                                                    .Select(workspace => Tuple.Create(workspace, workspace.TryGetWorkingFolderForLocalItem(localPath)))
                };
                $"{nameof(pcsAndAllTheirWorkspaces)}: {string.Join(",", pcsAndAllTheirWorkspaces.Select(arg => arg.LocalPath))}".Trace();
                $"{nameof(pcsAndAllTheirWorkspaces)}: {string.Join(",", pcsAndAllTheirWorkspaces.Select(arg => arg.WorkspaceAndWorkingFolderList.Count()))}".Trace();

                // select the relevant information from the above gross and create workspace and mapping where necessary
                var pcsAndMappedWorkspaces =
                    from a in pcsAndAllTheirWorkspaces
                    let workspaceAndFolder                       = a.WorkspaceAndWorkingFolderList.SingleOrDefault(tuple => tuple.Item2 != null)
                                                        let name = workspaceAndFolder?.Item1.Name ?? workspaceName(a.ProjectCollection)
                                                                   let workspace = workspaceAndFolder?.Item1 ?? mapWorkspace(createWorkSpace(a.VersionControlServer, name), a.ProjectCollection)
                                                                                   let workingFolder = workspaceAndFolder?.Item2 ?? workspace.TryGetWorkingFolderForLocalItem(a.LocalPath)
                                                                                                       select new
                {
                    a.ProjectCollection,
                    a.VersionControlServer,
                    Workspace     = workspace,
                    WorkingFolder = workingFolder
                };
                $"{nameof(pcsAndMappedWorkspaces)}: {string.Join(",", pcsAndMappedWorkspaces.Select(arg => arg.WorkingFolder.LocalItem))}".Trace();
                var allProjects =
                    from p in pcsAndMappedWorkspaces
                    from pp in p.ProjectCollection.GetTeamProjects()
                    let sp                   = pp.GetProjectServerPath(p.ProjectCollection)
                                      let wf = p.Workspace.TryGetWorkingFolderForServerItem(sp)
                                               where wf.LocalItem.ToLowerInvariant().Contains(Configuration.SourceRoot.ToLowerInvariant())
                                               select new
                {
                    ProjectCollection = p,
                    Project           = pp,
                    LocalPath         = pp.GetProjectLocalPath(p.ProjectCollection),
                    ServerPath        = sp,
                    WorkspaceInfo     = p.Workspace,
                    WorkingFolder     = wf
                };
                $"{nameof(allProjects)}: {string.Join(",", allProjects.Select(arg => arg.LocalPath))}".Trace();
                var filterStats = new Dictionary <StatTypes, int>
                {
                    [StatTypes.Added]   = 0,
                    [StatTypes.Deleted] = 0,
                    [StatTypes.Ignored] = 0,
                    [StatTypes.Skipped] = 0
                };

                string[] exceptions = { @"vnext", @"-oem" };
                string[] exclusions = { @"/development/", @"/release/", @"/team/" };
                var      maxAge     = TimeSpan.FromHours(6.0);

                var fc = new GetFilterCallback((Workspace workspace,
                                                ILocalUpdateOperation[] operations,
                                                object userData) =>
                {
                    var spec = userData as ItemSpec;
                    $"TFS filter callback: workspace name = {workspace.Name} | spec.item = {spec.Item} | number of operations {operations.Length}".Trace();
                    foreach (var operation in operations)
                    {
                        if (
                            operation.TargetServerItem != null &&
                            exclusions.Any(s1 => operation.TargetServerItem.ToLowerInvariant().Contains(s1)) &&
                            !exceptions.Any(s2 => operation.TargetServerItem.ToLowerInvariant().Contains(s2)))
                        {
                            operation.Ignore = true;
                            filterStats[StatTypes.Skipped]++;
                        }
                        if (
                            operation.SourceLocalItem != null &&
                            File.Exists(operation.SourceLocalItem) &&
                            (DateTime.UtcNow - File.GetLastWriteTimeUtc(operation.SourceLocalItem) < maxAge)
                            )
                        {
                            filterStats[StatTypes.Skipped]++;
                            operation.Ignore = true;
                        }
                        if (operation.TargetLocalItem == null)
                        {
                            filterStats[StatTypes.Deleted]++;
                        }
                        filterStats[StatTypes.Added]++;
                    }
                });

                $"Getting all files from {allProjects.Count()} projects".Trace();
                // get all the files
                allProjects.AsParallel().WithDegreeOfParallelism(1).ForAll(obj =>
                {
                    var subs = obj.ProjectCollection.VersionControlServer.GetItems($"{obj.WorkingFolder.ServerItem}/*");
                    for (int i = 0; i < subs.Items.Length; i++)
                    {
                        foreach (var ext in Extensions)
                        {
                            $"get files: {nameof(ext)} = {ext}".Trace();
                            var pattern    = $"{subs.Items[i].ServerItem}/*.{ext}";
                            var itemSpec   = new ItemSpec(pattern, RecursionType.Full);
                            var getRequest = new GetRequest(itemSpec, VersionSpec.Latest);
                            $"get files: {nameof(pattern)} = {pattern}".Trace();
                            $"get files: {nameof(itemSpec)} = {itemSpec.Item}".Trace();
                            try
                            {
                                obj.WorkspaceInfo.Get(getRequest, GetOptions.GetAll, fc, itemSpec);
                            }
                            catch (Exception e)
                            {
                                e.Error();
                            }
                        }
                    }
                });
                sw.Stop();
                $"Finished get info for all TPCs and all projects. Time elapsed: {sw.ElapsedMilliseconds.ToString("F")}".Info();
            }
            catch (Exception e)
            {
                e.Error();
                throw;
            }
        }