/// <summary>
        /// Syncs to given label.
        /// </summary>
        /// <param name="BranchPath">Current branch path.</param>
        /// <param name="LabelName">Label name to sync.</param>
        /// <param name="bArtistSync">Perform artist sync? (binaries to label, content to latest)</param>
        /// <param name="bPreview">Perform preview sync? (p4 sync -n)</param>
        private void SyncToLabel(string BranchPath, string LabelName, bool bArtistSync = true, bool bPreview = false)
        {
            var           ProgramRevisionSpec = "@" + LabelName;
            List <string> SyncSteps;

            if (bArtistSync)
            {
                // Get latest CL number to sync cause @head can change during
                // different syncs and it could create integrity problems in
                // workspace.
                var ContentRevisionSpec = "@" + P4.GetLatestCLNumber().ToString();

                var GameName = ParseGameNameFromLabel(LabelName);

                var ArtistSyncRulesPath = string.Format("{0}/{1}/Build/ArtistSyncRules.xml",
                                                        BranchPath, string.IsNullOrWhiteSpace(GameName) ? "Samples" : GameName);

                var SyncRules = string.Join("\n", P4.P4Print(ArtistSyncRulesPath + "#head"));

                if (string.IsNullOrWhiteSpace(SyncRules))
                {
                    throw new AutomationException("The path {0} is not valid or file is empty.", ArtistSyncRulesPath);
                }

                SyncSteps = GenerateSyncSteps(SyncRules, ContentRevisionSpec, ProgramRevisionSpec);
            }
            else
            {
                SyncSteps = new List <string>();
                SyncSteps.Add("/..." + ProgramRevisionSpec);                 // all files to label
            }

            foreach (var SyncStep in SyncSteps)
            {
                P4.Sync((bPreview ? "-n " : "") + BranchPath + SyncStep);
            }
        }