示例#1
0
        /// <summary>
        /// Execute the task.
        /// </summary>
        /// <param name="Job">Information about the current job</param>
        /// <param name="BuildProducts">Set of build products produced by this node.</param>
        /// <param name="TagNameToFileSet">Mapping from tag names to the set of files they include</param>
        public override void Execute(JobContext Job, HashSet <FileReference> BuildProducts, Dictionary <string, HashSet <FileReference> > TagNameToFileSet)
        {
            HashSet <FileReference> Files = ResolveFilespec(CommandUtils.RootDirectory, Parameters.Files, TagNameToFileSet);

            if (CommandUtils.AllowSubmit && Files.Count > 0)
            {
                // Get the connection that we're going to submit with
                P4Connection SubmitP4 = CommandUtils.P4;
                if (Parameters.Workspace != null)
                {
                    // Create a brand new workspace
                    P4ClientInfo Client = new P4ClientInfo();
                    Client.Owner    = CommandUtils.P4Env.User;
                    Client.Host     = Environment.MachineName;
                    Client.Stream   = Parameters.Stream ?? CommandUtils.P4Env.Branch;
                    Client.RootPath = Parameters.RootDir ?? CommandUtils.RootDirectory.FullName;
                    Client.Name     = Parameters.Workspace;
                    Client.Options  = P4ClientOption.NoAllWrite | P4ClientOption.Clobber | P4ClientOption.NoCompress | P4ClientOption.Unlocked | P4ClientOption.NoModTime | P4ClientOption.RmDir;
                    Client.LineEnd  = P4LineEnd.Local;
                    CommandUtils.P4.CreateClient(Client, AllowSpew: false);

                    // Create a new connection for it
                    SubmitP4 = new P4Connection(Client.Owner, Client.Name);
                }

                // Get the latest version of it
                int NewCL = SubmitP4.CreateChange(Description: Parameters.Description);
                foreach (FileReference File in Files)
                {
                    SubmitP4.Revert(String.Format("-k \"{0}\"", File.FullName));
                    SubmitP4.Sync(String.Format("-k \"{0}\"", File.FullName), AllowSpew: false);
                    SubmitP4.Add(NewCL, String.Format("\"{0}\"", File.FullName));
                    SubmitP4.Edit(NewCL, String.Format("\"{0}\"", File.FullName));
                    if (Parameters.FileType != null)
                    {
                        SubmitP4.P4(String.Format("reopen -t \"{0}\" \"{1}\"", Parameters.FileType, File.FullName), AllowSpew: false);
                    }
                }

                // Revert any unchanged files
                if (Parameters.RevertUnchanged)
                {
                    SubmitP4.RevertUnchanged(NewCL);
                    if (SubmitP4.TryDeleteEmptyChange(NewCL))
                    {
                        CommandUtils.Log("No files to submit; ignored.");
                        return;
                    }
                }

                // Submit it
                int SubmittedCL;
                SubmitP4.Submit(NewCL, out SubmittedCL);
                if (SubmittedCL <= 0)
                {
                    throw new AutomationException("Submit failed.");
                }
                CommandUtils.Log("Submitted in changelist {0}", SubmittedCL);
            }
        }
        public override void ExecuteBuild()
        {
            // Parse the parameters
            string DepotPath = ParseParamValue("DepotPath");

            if (DepotPath == null)
            {
                throw new AutomationException("Missing -DepotPath=... parameter");
            }

            string OutputDir = ParseParamValue("OutputDir");

            if (OutputDir == null)
            {
                throw new AutomationException("Missing -OutputDir=... parameter");
            }

            // Create a temporary client to sync down the folder
            string ClientName = String.Format("{0}_{1}_SyncDepotPath_Temp", P4Env.User, Environment.MachineName);

            List <KeyValuePair <string, string> > RequiredView = new List <KeyValuePair <string, string> >();

            RequiredView.Add(new KeyValuePair <string, string>(DepotPath, "/..."));

            if (P4.DoesClientExist(ClientName))
            {
                P4.DeleteClient(ClientName);
            }

            P4ClientInfo Client = new P4ClientInfo();

            Client.Owner    = P4Env.User;
            Client.Host     = Environment.MachineName;
            Client.RootPath = OutputDir;
            Client.Name     = ClientName;
            Client.View     = RequiredView;
            Client.Stream   = null;
            Client.Options  = P4ClientOption.NoAllWrite | P4ClientOption.Clobber | P4ClientOption.NoCompress | P4ClientOption.Unlocked | P4ClientOption.NoModTime | P4ClientOption.RmDir;
            Client.LineEnd  = P4LineEnd.Local;
            P4.CreateClient(Client);

            // Sync the workspace, then delete the client
            try
            {
                P4Connection Perforce = new P4Connection(P4Env.User, ClientName);
                Perforce.Sync("-f //...");
            }
            finally
            {
                P4.DeleteClient(ClientName);
            }
        }
示例#3
0
        /// <summary>
        /// Detects a workspace given the current user name, host name and depot path.
        /// </summary>
        /// <param name="UserName">User name</param>
        /// <param name="HostName">Host</param>
        /// <param name="UATLocation">Path to UAT exe, this will be checked agains the root path.</param>
        /// <returns>Client to use.</returns>
        private static P4ClientInfo DetectClient(P4Connection Connection, string UserName, string HostName, string UATLocation)
        {
            CommandUtils.LogVerbose("uebp_CLIENT not set, detecting current client...");

            var MatchingClients = new List <P4ClientInfo>();

            P4ClientInfo[] P4Clients = Connection.GetClientsForUser(UserName, UATLocation);
            foreach (var Client in P4Clients)
            {
                if (!String.IsNullOrEmpty(Client.Host) && String.Compare(Client.Host, HostName, true) != 0)
                {
                    Log.TraceInformation("Rejecting client because of different Host {0} \"{1}\" != \"{2}\"", Client.Name, Client.Host, HostName);
                    continue;
                }

                MatchingClients.Add(Client);
            }

            P4ClientInfo ClientToUse = null;

            if (MatchingClients.Count == 0)
            {
                throw new AutomationException("No matching clientspecs found!");
            }
            else if (MatchingClients.Count == 1)
            {
                ClientToUse = MatchingClients[0];
            }
            else
            {
                // We may have empty host clients here, so pick the first non-empty one if possible
                foreach (var Client in MatchingClients)
                {
                    if (!String.IsNullOrEmpty(Client.Host) && String.Compare(Client.Host, HostName, true) == 0)
                    {
                        ClientToUse = Client;
                        break;
                    }
                }
                if (ClientToUse == null)
                {
                    Log.TraceWarning("{0} clients found that match the current host and root path. The most recently accessed client will be used.", MatchingClients.Count);
                    ClientToUse = GetMostRecentClient(MatchingClients);
                }
            }

            return(ClientToUse);
        }
示例#4
0
        /// <summary>
        /// Given a list of clients with the same owner and root path, tries to find the most recently accessed one.
        /// </summary>
        /// <param name="Clients">List of clients with the same owner and path.</param>
        /// <returns>The most recent client from the list.</returns>
        private static P4ClientInfo GetMostRecentClient(List <P4ClientInfo> Clients)
        {
            Log.TraceVerbose("Detecting the most recent client.");
            P4ClientInfo MostRecentClient     = null;
            var          MostRecentAccessTime = DateTime.MinValue;

            foreach (var ClientInfo in Clients)
            {
                if (ClientInfo.Access.Ticks > MostRecentAccessTime.Ticks)
                {
                    MostRecentAccessTime = ClientInfo.Access;
                    MostRecentClient     = ClientInfo;
                }
            }
            if (MostRecentClient == null)
            {
                throw new AutomationException("Failed to determine the most recent client in {0}", Clients[0].RootPath);
            }
            return(MostRecentClient);
        }
示例#5
0
        /// <summary>
        /// Detects root paths for the specified client.
        /// </summary>
        /// <param name="UATLocation">AutomationTool.exe location</param>
        /// <param name="ThisClient">Client to detect the root paths for</param>
        /// <param name="BuildRootPath">Build root</param>
        /// <param name="LocalRootPath">Local root</param>
        /// <param name="ClientRootPath">Client root</param>
        private static void DetectRootPaths(P4Connection Connection, string LocalRootPath, P4ClientInfo ThisClient, out string BuildRootPath, out string ClientRootPath)
        {
            if (!String.IsNullOrEmpty(ThisClient.Stream))
            {
                BuildRootPath  = ThisClient.Stream;
                ClientRootPath = String.Format("//{0}", ThisClient.Name);
            }
            else
            {
                // Figure out the build root
                string         KnownFilePathFromRoot = CommandEnvironment.KnownFileRelativeToRoot;
                string         KnownLocalPath        = CommandUtils.MakePathSafeToUseWithCommandLine(CommandUtils.CombinePaths(PathSeparator.Slash, LocalRootPath, KnownFilePathFromRoot));
                IProcessResult P4Result = Connection.P4(String.Format("files -m 1 {0}", KnownLocalPath), AllowSpew: false);

                string KnownFileDepotMapping = P4Result.Output;

                // Get the build root
                Log.TraceVerbose("Looking for {0} in {1}", KnownFilePathFromRoot, KnownFileDepotMapping);
                int EndIdx = KnownFileDepotMapping.IndexOf(KnownFilePathFromRoot, StringComparison.CurrentCultureIgnoreCase);
                if (EndIdx < 0)
                {
                    EndIdx = KnownFileDepotMapping.IndexOf(CommandUtils.ConvertSeparators(PathSeparator.Slash, KnownFilePathFromRoot), StringComparison.CurrentCultureIgnoreCase);
                }
                // Get the root path without the trailing path separator
                BuildRootPath = KnownFileDepotMapping.Substring(0, EndIdx - 1);

                // Get the client root
                if (LocalRootPath.StartsWith(CommandUtils.CombinePaths(PathSeparator.Slash, ThisClient.RootPath, "/"), StringComparison.InvariantCultureIgnoreCase) || LocalRootPath == CommandUtils.CombinePaths(PathSeparator.Slash, ThisClient.RootPath))
                {
                    ClientRootPath = CommandUtils.CombinePaths(PathSeparator.Depot, String.Format("//{0}", ThisClient.Name), LocalRootPath.Substring(ThisClient.RootPath.Length));
                }
                else
                {
                    throw new AutomationException("LocalRootPath ({0}) does not start with the client root path ({1})", LocalRootPath, ThisClient.RootPath);
                }
            }
        }
示例#6
0
        /// <summary>
        /// Constructor. Derives the Perforce environment settings.
        /// </summary>
        internal P4Environment(CommandEnvironment CmdEnv)
        {
            // Get the Perforce port setting
            ServerAndPort = CommandUtils.GetEnvVar(EnvVarNames.P4Port);
            if (String.IsNullOrEmpty(ServerAndPort))
            {
                ServerAndPort = DetectP4Port();
                CommandUtils.SetEnvVar(EnvVarNames.P4Port, ServerAndPort);
            }

            // Get the Perforce user setting
            User = CommandUtils.GetEnvVar(EnvVarNames.User);
            if (String.IsNullOrEmpty(User))
            {
                P4Connection DefaultConnection = new P4Connection(User: null, Client: null, ServerAndPort: ServerAndPort);
                User = DetectUserName(DefaultConnection);
                CommandUtils.SetEnvVar(EnvVarNames.User, User);
            }

            // Get the Perforce client setting
            Client = CommandUtils.GetEnvVar(EnvVarNames.Client);
            if (String.IsNullOrEmpty(Client))
            {
                P4Connection DefaultConnection = new P4Connection(User: User, Client: null, ServerAndPort: ServerAndPort);
                P4ClientInfo ThisClient        = DetectClient(DefaultConnection, User, Environment.MachineName.ToLower(), CmdEnv.UATExe);
                Log.TraceInformation("Using user {0} clientspec {1} {2}", User, ThisClient.Name, ThisClient.RootPath);

                string       BranchPath;
                string       ClientRootPath;
                P4Connection ClientConnection = new P4Connection(User: User, Client: ThisClient.Name, ServerAndPort: ServerAndPort);
                DetectRootPaths(ClientConnection, CmdEnv.LocalRoot, ThisClient, out BranchPath, out ClientRootPath);

                Client = ThisClient.Name;
                CommandUtils.SetEnvVar(EnvVarNames.Client, Client);

                Branch = BranchPath;
                CommandUtils.SetEnvVar(EnvVarNames.BuildRootP4, Branch);

                ClientRoot = ClientRootPath;
                CommandUtils.SetEnvVar(EnvVarNames.ClientRoot, ClientRootPath);
            }
            else
            {
                Branch     = CommandUtils.GetEnvVar(EnvVarNames.BuildRootP4);
                ClientRoot = CommandUtils.GetEnvVar(EnvVarNames.ClientRoot);
                if (String.IsNullOrEmpty(Branch) || String.IsNullOrEmpty(ClientRoot))
                {
                    throw new AutomationException("{0} and {1} must also be set with {2}", EnvVarNames.ClientRoot, EnvVarNames.BuildRootP4, EnvVarNames.Client);
                }
            }

            // We expect the build root to not end with a path separator
            if (Branch.EndsWith("/"))
            {
                Branch = Branch.TrimEnd('/');
                CommandUtils.SetEnvVar(EnvVarNames.BuildRootP4, Branch);
            }

            // Set the current changelist
            string ChangelistString = CommandUtils.GetEnvVar(EnvVarNames.Changelist, null);

            if (String.IsNullOrEmpty(ChangelistString) && CommandUtils.P4CLRequired)
            {
                P4Connection Connection = new P4Connection(User, Client, ServerAndPort);
                ChangelistString = DetectCurrentCL(Connection, ClientRoot);
                CommandUtils.SetEnvVar(EnvVarNames.Changelist, ChangelistString);
            }
            if (!String.IsNullOrEmpty(ChangelistString))
            {
                Changelist = int.Parse(ChangelistString);
            }

            // Set the current code changelist
            string CodeChangelistString = CommandUtils.GetEnvVar(EnvVarNames.CodeChangelist);

            if (String.IsNullOrEmpty(CodeChangelistString) && CommandUtils.P4CLRequired)
            {
                P4Connection Connection = new P4Connection(User, Client, ServerAndPort);
                CodeChangelistString = DetectCurrentCodeCL(Connection, ClientRoot);
                CommandUtils.SetEnvVar(EnvVarNames.CodeChangelist, CodeChangelistString);
            }
            if (!String.IsNullOrEmpty(CodeChangelistString))
            {
                CodeChangelist = int.Parse(CodeChangelistString);
            }

            // Set the standard environment variables based on the values we've found
            CommandUtils.SetEnvVar("P4PORT", ServerAndPort);
            CommandUtils.SetEnvVar("P4USER", User);
            CommandUtils.SetEnvVar("P4CLIENT", Client);

            // Write a summary of the settings to the output window
            if (!CommandUtils.CmdEnv.IsChildInstance)
            {
                Log.TraceInformation("Detected Perforce Settings:");
                Log.TraceInformation("  Server: {0}", ServerAndPort);
                Log.TraceInformation("  User: {0}", User);
                Log.TraceInformation("  Client: {0}", Client);
                Log.TraceInformation("  Branch: {0}", Branch);
                if (ChangelistInternal != -1)
                {
                    Log.TraceInformation("  Last Change: {0}", Changelist);
                }
                if (CodeChangelistInternal != -1)
                {
                    Log.TraceInformation("  Last Code Change: {0}", CodeChangelist);
                }
            }

            // Write all the environment variables to the log
            Log.TraceLog("Perforce Environment Variables:");
            Log.TraceLog("  {0}={1}", EnvVarNames.P4Port, InternalUtils.GetEnvironmentVariable(EnvVarNames.P4Port, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.User, InternalUtils.GetEnvironmentVariable(EnvVarNames.User, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.Client, InternalUtils.GetEnvironmentVariable(EnvVarNames.Client, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.BuildRootP4, InternalUtils.GetEnvironmentVariable(EnvVarNames.BuildRootP4, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.BuildRootEscaped, InternalUtils.GetEnvironmentVariable(EnvVarNames.BuildRootEscaped, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.ClientRoot, InternalUtils.GetEnvironmentVariable(EnvVarNames.ClientRoot, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.Changelist, InternalUtils.GetEnvironmentVariable(EnvVarNames.Changelist, "", true));
            Log.TraceLog("  {0}={1}", EnvVarNames.CodeChangelist, InternalUtils.GetEnvironmentVariable(EnvVarNames.CodeChangelist, "", true));
            Log.TraceLog("  {0}={1}", "P4PORT", InternalUtils.GetEnvironmentVariable("P4PORT", "", true));
            Log.TraceLog("  {0}={1}", "P4USER", InternalUtils.GetEnvironmentVariable("P4USER", "", true));
            Log.TraceLog("  {0}={1}", "P4CLIENT", InternalUtils.GetEnvironmentVariable("P4CLIENT", "", true));
        }
示例#7
0
        /// <summary>
        /// Initializes the environment. Tries to autodetect all source control settings.
        /// </summary>
        /// <param name="CompilationEnv">Compilation environment</param>
        protected override void InitEnvironment(P4Connection Connection, CommandEnvironment CmdEnv)
        {
            var HostName  = Environment.MachineName.ToLower();
            var P4PortEnv = Environment.GetEnvironmentVariable("P4PORT");

            if (String.IsNullOrEmpty(P4PortEnv))
            {
                P4PortEnv = DetectP4Port();
            }

            var UserName = CommandUtils.GetEnvVar(EnvVarNames.User);

            if (String.IsNullOrEmpty(UserName))
            {
                UserName = DetectUserName(Connection);
            }

            var          CommandLineClient = CommandUtils.GetEnvVar(EnvVarNames.Client);
            P4ClientInfo ThisClient        = null;

            if (String.IsNullOrEmpty(CommandLineClient) == false)
            {
                ThisClient = Connection.GetClientInfo(CommandLineClient);
                if (ThisClient == null)
                {
                    throw new AutomationException("Unable to find client {0}", CommandLineClient);
                }
                if (String.Compare(ThisClient.Owner, UserName, true) != 0)
                {
                    throw new AutomationException("Client specified with {0}={1} has a different owner then the detected user name (has: {2}, expected: {3})",
                                                  EnvVarNames.Client, CommandLineClient, ThisClient.Owner, UserName);
                }
            }
            else
            {
                ThisClient = DetectClient(Connection, UserName, HostName, CmdEnv.UATExe);
            }

            Log.TraceInformation("Using user {0} clientspec {1} {2}", UserName, ThisClient.Name, ThisClient.RootPath);
            Environment.SetEnvironmentVariable("P4CLIENT", ThisClient.Name);

            string BuildRootPath;
            string ClientRootPath;

            DetectRootPaths(Connection, CmdEnv.LocalRoot, ThisClient, out BuildRootPath, out ClientRootPath);

            CommandUtils.ConditionallySetEnvVar(EnvVarNames.P4Port, P4PortEnv);
            CommandUtils.ConditionallySetEnvVar(EnvVarNames.User, UserName);
            CommandUtils.ConditionallySetEnvVar(EnvVarNames.Client, ThisClient.Name);
            CommandUtils.ConditionallySetEnvVar(EnvVarNames.BuildRootP4, BuildRootPath);
            CommandUtils.ConditionallySetEnvVar(EnvVarNames.ClientRoot, ClientRootPath);

            var CLString = CommandUtils.GetEnvVar(EnvVarNames.Changelist, null);

            if (String.IsNullOrEmpty(CLString) && CommandUtils.P4CLRequired)
            {
                CLString = DetectCurrentCL(Connection, ClientRootPath);
            }
            if (!String.IsNullOrEmpty(CLString))
            {
                CommandUtils.ConditionallySetEnvVar(EnvVarNames.Changelist, CLString);
            }

            CommandUtils.ConditionallySetEnvVar(EnvVarNames.LabelToSync, "");
            CommandUtils.ConditionallySetEnvVar("P4USER", UserName);
            CommandUtils.ConditionallySetEnvVar("P4CLIENT", ThisClient.Name);

            var P4Password = Environment.GetEnvironmentVariable(EnvVarNames.P4Password);

            if (!String.IsNullOrEmpty(P4Password))
            {
                CommandUtils.ConditionallySetEnvVar("P4PASSWD", P4Password);
            }

            SetBuildRootEscaped();

            base.InitEnvironment(Connection, CmdEnv);
        }
示例#8
0
        /// <summary>
        /// Detects a workspace given the current user name, host name and depot path.
        /// </summary>
        /// <param name="UserName">User name</param>
        /// <param name="HostName">Host</param>
        /// <param name="UATLocation">Path to UAT exe, this will be checked agains the root path.</param>
        /// <returns>Client to use.</returns>
        private static P4ClientInfo DetectClient(P4Connection Connection, string UserName, string HostName, string UATLocation)
        {
            CommandUtils.LogVerbose("uebp_CLIENT not set, detecting current client...");

            // Check the default client. If it matches we can save any guess work.
            IProcessResult Result = CommandUtils.Run(HostPlatform.Current.P4Exe, "set -q P4CLIENT", null, CommandUtils.ERunOptions.NoLoggingOfRunCommand);

            if (Result.ExitCode == 0)
            {
                const string KeyName = "P4CLIENT=";
                if (Result.Output.StartsWith(KeyName))
                {
                    string       ClientName = Result.Output.Substring(KeyName.Length).Trim();
                    P4ClientInfo ClientInfo = Connection.GetClientInfo(ClientName, true);
                    if (Connection.IsValidClientForFile(ClientInfo, UATLocation))
                    {
                        return(ClientInfo);
                    }
                }
            }

            // Otherwise search for all clients that match
            List <P4ClientInfo> MatchingClients = new List <P4ClientInfo>();

            P4ClientInfo[] P4Clients = Connection.GetClientsForUser(UserName, UATLocation);
            foreach (P4ClientInfo Client in P4Clients)
            {
                if (!String.IsNullOrEmpty(Client.Host) && String.Compare(Client.Host, HostName, true) != 0)
                {
                    Log.TraceInformation("Rejecting client because of different Host {0} \"{1}\" != \"{2}\"", Client.Name, Client.Host, HostName);
                    continue;
                }

                MatchingClients.Add(Client);
            }

            P4ClientInfo ClientToUse = null;

            if (MatchingClients.Count == 0)
            {
                throw new AutomationException("No matching clientspecs found!");
            }
            else if (MatchingClients.Count == 1)
            {
                ClientToUse = MatchingClients[0];
            }
            else
            {
                // We may have empty host clients here, so pick the first non-empty one if possible
                foreach (P4ClientInfo Client in MatchingClients)
                {
                    if (!String.IsNullOrEmpty(Client.Host) && String.Compare(Client.Host, HostName, true) == 0)
                    {
                        ClientToUse = Client;
                        break;
                    }
                }
                if (ClientToUse == null)
                {
                    Log.TraceWarning("{0} clients found that match the current host and root path. The most recently accessed client will be used.", MatchingClients.Count);
                    ClientToUse = GetMostRecentClient(MatchingClients);
                }
            }

            return(ClientToUse);
        }
        public override void ExecuteBuild()
        {
            // Parse the target list
            string[] Targets = ParseParamValues("Target");
            if (Targets.Length == 0)
            {
                throw new AutomationException("No targets specified (eg. -Target=\"UE4Editor Win64 Development\")");
            }

            // Parse the archive path
            string ArchivePath = ParseParamValue("Archive");

            if (ArchivePath != null && (!ArchivePath.StartsWith("//") || ArchivePath.Sum(x => (x == '/')? 1 : 0) < 4))
            {
                throw new AutomationException("Archive path is not a valid depot filename");
            }

            // Prepare the build agenda
            UE4Build.BuildAgenda Agenda = new UE4Build.BuildAgenda();
            foreach (string Target in Targets)
            {
                string[] Tokens = Target.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                UnrealTargetPlatform      Platform;
                UnrealTargetConfiguration Configuration;
                if (Tokens.Length < 3 || !Enum.TryParse(Tokens[1], true, out Platform) || !Enum.TryParse(Tokens[2], true, out Configuration))
                {
                    throw new AutomationException("Invalid target '{0}' - expected <TargetName> <Platform> <Configuration>");
                }

                Agenda.AddTarget(Tokens[0], Platform, Configuration, InAddArgs: String.Join(" ", Tokens.Skip(3)));
            }

            // Build everything
            UE4Build Builder = new UE4Build(this);

            Builder.Build(Agenda, InUpdateVersionFiles: ArchivePath != null);

            // Include the build products for UAT and UBT if required
            if (ParseParam("WithUAT"))
            {
                Builder.AddUATFilesToBuildProducts();
            }
            if (ParseParam("WithUBT"))
            {
                Builder.AddUBTFilesToBuildProducts();
            }

            // Archive the build products
            if (ArchivePath != null)
            {
                // Create an output folder
                string OutputFolder = Path.Combine(CommandUtils.CmdEnv.LocalRoot, "ArchiveForUGS");
                Directory.CreateDirectory(OutputFolder);

                // Create a temp folder for storing stripped PDB files
                string SymbolsFolder = Path.Combine(OutputFolder, "Symbols");
                Directory.CreateDirectory(SymbolsFolder);

                // Get the Windows toolchain
                Platform WindowsTargetPlatform = Platform.GetPlatform(UnrealTargetPlatform.Win64);

                // Figure out all the files for the archive
                string ZipFileName = Path.Combine(OutputFolder, "Archive.zip");
                using (Ionic.Zip.ZipFile Zip = new Ionic.Zip.ZipFile())
                {
                    Zip.UseZip64WhenSaving = Ionic.Zip.Zip64Option.Always;
                    foreach (string BuildProduct in Builder.BuildProductFiles)
                    {
                        if (!File.Exists(BuildProduct))
                        {
                            throw new AutomationException("Missing build product: {0}", BuildProduct);
                        }
                        if (BuildProduct.EndsWith(".pdb", StringComparison.InvariantCultureIgnoreCase))
                        {
                            string StrippedFileName = CommandUtils.MakeRerootedFilePath(BuildProduct, CommandUtils.CmdEnv.LocalRoot, SymbolsFolder);
                            Directory.CreateDirectory(Path.GetDirectoryName(StrippedFileName));
                            WindowsTargetPlatform.StripSymbols(new FileReference(BuildProduct), new FileReference(StrippedFileName));
                            Zip.AddFile(StrippedFileName, Path.GetDirectoryName(CommandUtils.StripBaseDirectory(StrippedFileName, SymbolsFolder)));
                        }
                        else
                        {
                            Zip.AddFile(BuildProduct, Path.GetDirectoryName(CommandUtils.StripBaseDirectory(BuildProduct, CommandUtils.CmdEnv.LocalRoot)));
                        }
                    }
                    // Create the zip file
                    Console.WriteLine("Writing {0}...", ZipFileName);
                    Zip.Save(ZipFileName);
                }

                // Submit it to Perforce if required
                if (CommandUtils.AllowSubmit)
                {
                    // Delete any existing clientspec for submitting
                    string ClientName = Environment.MachineName + "_BuildForUGS";

                    // Create a brand new one
                    P4ClientInfo Client = new P4ClientInfo();
                    Client.Owner    = CommandUtils.P4Env.User;
                    Client.Host     = Environment.MachineName;
                    Client.Stream   = ArchivePath.Substring(0, ArchivePath.IndexOf('/', ArchivePath.IndexOf('/', 2) + 1));
                    Client.RootPath = Path.Combine(OutputFolder, "Perforce");
                    Client.Name     = ClientName;
                    Client.Options  = P4ClientOption.NoAllWrite | P4ClientOption.NoClobber | P4ClientOption.NoCompress | P4ClientOption.Unlocked | P4ClientOption.NoModTime | P4ClientOption.RmDir;
                    Client.LineEnd  = P4LineEnd.Local;
                    P4.CreateClient(Client, AllowSpew: false);

                    // Create a new P4 connection for this workspace
                    P4Connection SubmitP4 = new P4Connection(Client.Owner, Client.Name, P4Env.ServerAndPort);
                    SubmitP4.Revert("-k //...");

                    // Figure out where the zip file has to go in Perforce
                    P4WhereRecord WhereZipFile = SubmitP4.Where(ArchivePath, false).FirstOrDefault(x => !x.bUnmap && x.Path != null);
                    if (WhereZipFile == null)
                    {
                        throw new AutomationException("Couldn't locate {0} in this workspace");
                    }

                    // Get the latest version of it
                    int NewCL = SubmitP4.CreateChange(Description: String.Format("[CL {0}] Updated binaries", P4Env.Changelist));
                    SubmitP4.Sync(String.Format("-k \"{0}\"", ArchivePath), AllowSpew: false);
                    CommandUtils.CopyFile(ZipFileName, WhereZipFile.Path);
                    SubmitP4.Add(NewCL, String.Format("\"{0}\"", ArchivePath));
                    SubmitP4.Edit(NewCL, String.Format("\"{0}\"", ArchivePath));

                    // Submit it
                    int SubmittedCL;
                    SubmitP4.Submit(NewCL, out SubmittedCL);
                    if (SubmittedCL <= 0)
                    {
                        throw new AutomationException("Submit failed.");
                    }
                    Console.WriteLine("Submitted in changelist {0}", SubmittedCL);
                }
            }
        }
    public override void ExecuteBuild()
    {
        string TemplateClient = "ue4_licensee_workspace";
        var    Clients        = P4.GetClientsForUser("UE4_Licensee");

        string TestClient = "UAT_Test_Client";

        P4ClientInfo NewClient = null;

        foreach (var Client in Clients)
        {
            if (Client.Name == TemplateClient)
            {
                NewClient = Client;
                break;
            }
        }
        if (NewClient == null)
        {
            throw new AutomationException("Could not find template");
        }
        NewClient.Owner    = P4Env.User;      // this is not right, we need the actual licensee user!
        NewClient.Host     = Environment.MachineName.ToLower();
        NewClient.RootPath = @"C:\TestClient";
        NewClient.Name     = TestClient;
        if (P4.DoesClientExist(TestClient))
        {
            P4.DeleteClient(TestClient);
        }
        P4.CreateClient(NewClient);

        //P4CLIENT         Name of client workspace        p4 help client
        //P4PASSWD         User password passed to server  p4 help passwd

        string[] VarsToSave =
        {
            "P4CLIENT",
            //"P4PASSWD",
        };
        var KeyValues = new Dictionary <string, string>();

        foreach (var ToSave in VarsToSave)
        {
            KeyValues.Add(ToSave, GetEnvVar(ToSave));
        }

        SetEnvVar("P4CLIENT", NewClient.Name);
        //SetEnv("P4PASSWD", ParseParamValue("LicenseePassword");


        //Sync(CombinePaths(PathSeparator.Slash, P4Env.BuildRootP4, "UE4Games.uprojectdirs"));
        string Output;

        P4.P4Output(out Output, "files -m 10 " + CombinePaths(PathSeparator.Slash, P4Env.Branch, "..."));

        var    Lines     = Output.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        string SlashRoot = CombinePaths(PathSeparator.Slash, P4Env.Branch, "/");
        string LocalRoot = CombinePaths(CmdEnv.LocalRoot, @"\");

        foreach (string Line in Lines)
        {
            if (Line.Contains(" - ") && Line.Contains("#"))
            {
                string depot = Line.Substring(0, Line.IndexOf("#"));
                if (!depot.Contains(SlashRoot))
                {
                    throw new AutomationException("{0} does not contain {1} and it is supposed to.", depot, P4Env.Branch);
                }
                string local = CombinePaths(depot.Replace(SlashRoot, LocalRoot));
                LogInformation("{0}", depot);
                LogInformation("    {0}", local);
            }
        }

        // should be used as a sanity check! make sure there are no files!
        P4.LogP4Output(out Output, "files -m 10 " + CombinePaths(PathSeparator.Slash, P4Env.Branch, "...", "NoRedist", "..."));

        // caution this doesn't actually use the client _view_ from the template at all!
        // if you want that sync -f -k /...
        // then use client syntax in the files command instead
        // don't think we care, we don't rely on licensee _views_

        foreach (var ToLoad in VarsToSave)
        {
            SetEnvVar(ToLoad, KeyValues[ToLoad]);
        }
        P4.DeleteClient(TestClient);
    }
    void ExecuteInner(string Dir, int PR)
    {
        string PRNum = PR.ToString();

        // Discard any old changes we may have committed
        RunGit("reset --hard");

        // show-ref is just a double check that the PR exists
        //var Refs = RunGit("show-ref");

        /*if (!Refs.Contains("refs/remotes/origin/pr/" + PRNum))
         * {
         *      throw new AutomationException("This is not among the refs: refs/remotes/origin/pr/{0}", PRNum);
         * }*/
        RunGit(String.Format("fetch origin refs/pull/{0}/head:pr/{1}", PRNum, PRNum));
        RunGit(String.Format("checkout pr/{0} --", PRNum));

        int    CLBase;
        string DepotBase;

        ScanForBranchAndCL_BaseVersion(String.Format("log --author=TimSweeney --author=UnrealBot -100 pr/{0} --", PRNum), out DepotBase, out CLBase);


        int    CLLive;
        string DepotLive;

        ScanForBranchAndCL_LiveVersion(String.Format("log -100 pr/{0} --", PRNum), out DepotLive, out CLLive);

        if (CLLive == 0 && CLBase == 0)
        {
            throw new AutomationException("Could not find a base change and branch using either method.");
        }

        int    CL    = 0;
        string Depot = "";

        if (CLBase > CLLive)
        {
            CL    = CLBase;
            Depot = DepotBase;
        }
        else
        {
            CL    = CLLive;
            Depot = DepotLive;
        }
        if (CL < 2000000 || String.IsNullOrWhiteSpace(Depot))
        {
            throw new AutomationException("Could not find a base change and branch using either method.");
        }


        P4ClientInfo NewClient = P4.GetClientInfo(P4Env.Client);

        foreach (var p in NewClient.View)
        {
            LogInformation("{0} = {1}", p.Key, p.Value);
        }

        string TestClient = P4Env.User + "_" + Environment.MachineName + "_PullRequests_" + Depot.Replace("/", "_");

        NewClient.Owner    = P4Env.User;
        NewClient.Host     = Environment.MachineName;
        NewClient.RootPath = Dir;
        NewClient.Name     = TestClient;
        NewClient.View     = new List <KeyValuePair <string, string> >();
        NewClient.View.Add(new KeyValuePair <string, string>(Depot + "/...", "/..."));
        NewClient.Stream = null;
        if (!P4.DoesClientExist(TestClient))
        {
            P4.CreateClient(NewClient);
        }

        var P4Sub = new P4Connection(P4Env.User, TestClient, P4Env.ServerAndPort);

        P4Sub.Sync(String.Format("-f -k -q {0}/...@{1}", Depot, CL));

        var Change = P4Sub.CreateChange(null, String.Format("GitHub pull request #{0}", PRNum));

        P4Sub.ReconcileNoDeletes(Change, CommandUtils.MakePathSafeToUseWithCommandLine(CombinePaths(Dir, bDoingUT ? "UnrealTournament" : "Engine", "...")));
        P4Sub.Shelve(Change);
        P4Sub.Revert(Change, "-k //...");
    }
示例#12
0
		/// <summary>
		/// Execute the task.
		/// </summary>
		/// <param name="Job">Information about the current job</param>
		/// <param name="BuildProducts">Set of build products produced by this node.</param>
		/// <param name="TagNameToFileSet">Mapping from tag names to the set of files they include</param>
		/// <returns>True if the task succeeded</returns>
		public override bool Execute(JobContext Job, HashSet<FileReference> BuildProducts, Dictionary<string, HashSet<FileReference>> TagNameToFileSet)
		{
			HashSet<FileReference> Files = ResolveFilespec(CommandUtils.RootDirectory, Parameters.Files, TagNameToFileSet);
			if (CommandUtils.AllowSubmit && Files.Count > 0)
			{
				// Get the connection that we're going to submit with
				P4Connection SubmitP4 = CommandUtils.P4;
				if (Parameters.Workspace != null)
				{
					// Create a brand new workspace
					P4ClientInfo Client = new P4ClientInfo();
					Client.Owner = Environment.UserName;
					Client.Host = Environment.MachineName;
					Client.Stream = Parameters.Stream ?? CommandUtils.P4Env.BuildRootP4;
					Client.RootPath = Parameters.RootDir ?? CommandUtils.RootDirectory.FullName;
					Client.Name = Parameters.Workspace;
					Client.Options = P4ClientOption.NoAllWrite | P4ClientOption.Clobber | P4ClientOption.NoCompress | P4ClientOption.Unlocked | P4ClientOption.NoModTime | P4ClientOption.RmDir;
					Client.LineEnd = P4LineEnd.Local;
					CommandUtils.P4.CreateClient(Client, AllowSpew: false);

					// Create a new connection for it
					SubmitP4 = new P4Connection(Client.Owner, Client.Name);
				}

				// Get the latest version of it
				int NewCL = SubmitP4.CreateChange(Description: Parameters.Description);
				foreach(FileReference File in Files)
				{
					SubmitP4.Revert(String.Format("-k \"{0}\"", File.FullName));
					SubmitP4.Sync(String.Format("-k \"{0}\"", File.FullName), AllowSpew: false);
					SubmitP4.Add(NewCL, String.Format("\"{0}\"", File.FullName));
					SubmitP4.Edit(NewCL, String.Format("\"{0}\"", File.FullName));
					if (Parameters.FileType != null)
					{
						SubmitP4.P4(String.Format("reopen -t \"{0}\" \"{1}\"", Parameters.FileType, File.FullName), AllowSpew: false);
					}
				}

				// Submit it
				int SubmittedCL;
				SubmitP4.Submit(NewCL, out SubmittedCL);
				if (SubmittedCL <= 0)
				{
					throw new AutomationException("Submit failed.");
				}
				CommandUtils.Log("Submitted in changelist {0}", SubmittedCL);
			}
			return true;
		}