Exemple #1
0
 //---------------------------------------------------------------------------------
 /// <summary>
 /// Translated vesion of GotoStack
 /// </summary>
 //---------------------------------------------------------------------------------
 public void GoToStack(StackInfo stack, StackLevel stackLevel)
 {
     DoRpcCall(() =>
     {
         var requestParams = new StackedRequestParams(stack, stackLevel);
         var result        = _server.InvokeWithParameterObjectAsync <StackInfoRequestResponse>(StringConstants.GoToStackLevel, requestParams).Result;
     });
 }
Exemple #2
0
 //---------------------------------------------------------------------------------
 /// <summary>
 /// Fill in the details of a level
 /// </summary>
 //---------------------------------------------------------------------------------
 public StackLevel GetLevelDetails(StackInfo stack, StackLevel level)
 {
     return(DoRpcCall(() =>
     {
         var requestParams = new StackedRequestParams(stack, level);
         var result = _server.InvokeWithParameterObjectAsync <GetLevelDetailsResponse>(StringConstants.GetLevelDetails, requestParams).Result;
         return result.StackLevel;
     }));
 }
Exemple #3
0
 //---------------------------------------------------------------------------------
 /// <summary>
 /// Current level in the stack
 /// </summary>
 //---------------------------------------------------------------------------------
 public static void SetCurrentLevel(this StackInfo stack, StackLevel newLevel)
 {
     stack.CurrentLevelNumber = -1;
     foreach (var level in stack.Levels)
     {
         level.IsCurrent = (newLevel != null && level.Number == newLevel.Number);
         if (level.IsCurrent)
         {
             stack.CurrentLevelNumber = level.Number;
         }
     }
 }
        //---------------------------------------------------------------------------------
        /// <summary>
        /// Fills in difficult to obtains details for a stacklevel
        /// </summary>
        //---------------------------------------------------------------------------------
        public StackLevel GetLevelDetails(StackLevel level)
        {
            Branch localBranch  = _git.GetBranch(level.LocalBranch);
            Branch targetBranch = _git.GetBranch(level.TargetOriginBranch);
            Branch sourceBranch = _git.GetBranch(level.OriginBranch);

            StackCommit[] GetCommitData(IEnumerable <Commit> commits)
            {
                return(commits?.Select(c => new StackCommit()
                {
                    Id = c.Id.ToString(), ShortMessage = c.MessageShort
                }).ToArray());
            }

            try
            {
                var lookingBack    = _git.GetCommitDifference(sourceBranch.CanonicalName, localBranch.CanonicalName);
                var lookingForward = _git.GetCommitDifference(localBranch.CanonicalName, targetBranch.CanonicalName);

                if (lookingBack.CommonAncestor != null)
                {
                    level.UnpulledCommits = GetCommitData(lookingBack.UnpulledCommits);
                    level.AllCommits      = GetCommitData(lookingBack.AllChildCommits);
                }

                if (lookingForward.CommonAncestor != null)
                {
                    level.UnpushedCommits = GetCommitData(lookingForward.UnpulledCommits);
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
                throw new ShortStackException("Fill error: " + e.Message);
            }

            level.PullRequest = new VSTSAccess(_git.RemoteUrl).GetPullRequestByBranch(level.TargetOriginBranch);

            return(level);
        }
Exemple #5
0
 //---------------------------------------------------------------------------------
 /// <summary>
 /// Add a level
 /// </summary>
 //---------------------------------------------------------------------------------
 public void AddLevel(StackLevel level)
 {
     _levels.Add(level);
     level.Stack = this;
 }
 public StackLevel GetLevelDetails(StackInfo stack, StackLevel level) => _processor.GetLevelDetails(level);
        //---------------------------------------------------------------------------------
        /// <summary>
        /// Create the next level in the specified stack
        /// </summary>
        //---------------------------------------------------------------------------------
        public void CreateNextStackLevel(string currentStackName, string origin = null)
        {
            if (_git.HasUncommittedChanges)
            {
                throw new ShortStackException("There are uncommitted edits.  Please resolve or stash these before attempting this operation.");
            }

            var currentStack = GetStack(currentStackName);

            if (currentStack == null)
            {
                throw new ShortStackException($"There is no stack information for the stack named '{currentStackName}'");
            }

            int currentLevelNumber = -1;

            var lastLevel = currentStack.LastLevel();

            if (lastLevel != null)
            {
                currentLevelNumber = lastLevel.Number;
                if (origin != null)
                {
                    throw new ShortStackException("Only the zero-level of a stack can have an origin override.");
                }

                // Make sure we are at the top of the stack
                if (!lastLevel.IsCurrent)
                {
                    _git.Checkout(lastLevel.LocalBranch);
                    currentStack.SetCurrentLevel(lastLevel);
                    LogVerbose($"Change branch to {lastLevel.LocalBranch}");
                }
            }

            // Set the origin to point to the lastLevel if there is one
            if (origin == null)
            {
                origin = lastLevel?.TargetOriginBranch;
            }

            // If we don't have an origin, something is wrong
            if (origin == null)
            {
                throw new ShortStackException("The origin must be specified for zero-level branches!");
            }

            // Fix up the origin branch name
            if (!origin.StartsWith("origin/"))
            {
                origin = "origin/" + origin;
            }

            // Create the new stack branch
            var    newLevelNumber = currentLevelNumber + 1;
            string newBranchName  = currentStack.CreateBranchLevelName(newLevelNumber);

            _git.CreateBranch(newBranchName, origin);
            LogVerbose($"Creating branch {newBranchName} to track {origin}");
            _git.Checkout(newBranchName, origin);
            LogVerbose($"Change branch to {newBranchName}");

            // Push up to the server to enforce branch creation there
            _git.Push(newBranchName);
            LogVerbose($"Pushed from {newBranchName} to origin/{newBranchName} ");

            // Put it on the current stack record
            var newLevel = new StackLevel()
            {
                IsCurrent = true,
                RecentCommitDescription = "[new]",
                LocalBranch             = newBranchName,
                Number             = newLevelNumber,
                OriginBranch       = origin,
                TargetOriginBranch = "origin/" + newBranchName,
                RepositoryUrl      = _git.RemoteUrl,
                StackName          = currentStack.StackName,
            };

            currentStack.AddLevel(newLevel);
            currentStack.SetCurrentLevel(newLevel);
            LogInformation($"Now on stack '{currentStack.StackName}', Level {newLevelNumber}");
        }
Exemple #8
0
        //---------------------------------------------------------------------------------
        /// <summary>
        /// ProcessRecord - main processing goes here
        /// </summary>
        //---------------------------------------------------------------------------------
        protected override void ProcessRecord()
        {
            base.ProcessRecord();

            if (CurrentStack == null)
            {
                Print(ConsoleColor.Red, "You are not in a stacked branch.  Use Get-Stacks to see available stacks.");
                return;
            }

            var danglingStatus = Handler.CheckServerForDanglingWork();

            if (danglingStatus == DanglingWorkStatus.UncommittedChanges)
            {
                Print(ConsoleColor.Red, "There are uncommitted changes. Please commit your changes first.");
                return;
            }

            int startLevel, stopLevel;

            if (!this.TryParseLevelNumber(Start, out startLevel))
            {
                if (String.IsNullOrEmpty(Start))
                {
                    startLevel = 1;
                }
                else
                {
                    Print(ConsoleColor.Red, "Start is an invalid level number");
                    return;
                }
            }

            if (!this.TryParseLevelNumber(Stop, out stopLevel))
            {
                if (String.IsNullOrEmpty(Stop))
                {
                    stopLevel = CurrentStack.CurrentLevel().Number;
                }
                else
                {
                    Print(ConsoleColor.Red, "Stop is an invalid level number");
                    return;
                }
            }

            if (startLevel > stopLevel)
            {
                Print(ConsoleColor.Red, "Start must be an earlier level than Stop");
                return;
            }


            StackLevel originalLevel = this.GetCurrentStackLevel();

            for (int i = startLevel; i <= stopLevel; i++)
            {
                StackLevel level = this.CurrentStack.Levels[i];
                this.Handler.GoToStack(this.CurrentStack.StackName, level.Number);
                level.FillDetails(this.Handler);
                if (level.UnpulledCommits.Any())
                {
                    //Pull and do a merge conflict
                }
                if (level.UnpushedCommits.Any() || level.UnpushedCommits.Any())
                {
                    this.Handler.PushStackLevel();
                }
            }

            this.Handler.GoToStack(this.CurrentStack.StackName, originalLevel.Number);
        }