Esempio n. 1
0
        public void ExportToVcs(string repoPath, DateTime?continueAfter)
        {
            if (resetRepo)
            {
                continueAfter = null;
            }
            this.continueAfter = continueAfter;
            workQueue.AddLast(delegate(object work)
            {
                var stopwatch = Stopwatch.StartNew();

                logger.WriteSectionSeparator();
                LogStatus(work, "Initializing repository");

                // create repository directory if it does not exist
                if (!Directory.Exists(repoPath))
                {
                    if (continueAfter != null)
                    {
                        throw new ProcessException("Unable to continue: " + repoPath + " does not exist.", null, null);
                    }
                    Directory.CreateDirectory(repoPath);
                }

                string vcs = vcsWrapper.GetVcs();

                while (!vcsWrapper.FindExecutable())
                {
                    var button = MessageBox.Show(vcs + " not found in PATH. " +
                                                 "If you need to modify your PATH variable, please " +
                                                 "restart the program for the changes to take effect.",
                                                 "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                    if (button == DialogResult.Cancel)
                    {
                        workQueue.Abort();
                        return;
                    }
                }

                bool makeInitialCommit = resetRepo;
                if (!RetryCancel(delegate
                                 { vcsWrapper.Init(resetRepo); }))
                {
                    return;
                }

                AbortRetryIgnore(delegate
                {
                    vcsWrapper.Configure(continueAfter == null);
                });

                var pathMapper = new VssPathMapper();

                if (UseProjectsFile)
                {
                    string rootPath = repoPath;
                    foreach (var rootProject in revisionAnalyzer.RootProjects)
                    {
                        string path = rootProject.RootPath;
                        path        = path.Replace("/", "\\");
                        if (path.StartsWith("\\"))
                        {
                            path = rootPath + path;
                        }
                        else
                        {
                            path = rootPath + "\\" + path;
                        }
                        pathMapper.SetProjectPath(rootProject.PhysicalName, path, rootProject.Path);
                    }
                }
                else
                {
                    // create mappings for root projects
                    foreach (var rootProject in revisionAnalyzer.RootProjects)
                    {
                        // root must be repo path here - the path mapper uses paths relative to this one
                        VssPathMapper vssPathMapper = new VssPathMapper();
                        var rootPath = repoPath;
                        if (RemovePath != "")
                        {
                            if (rootProject.Path.StartsWith(RemovePath))
                            {
                                string path = rootProject.Path.Replace(RemovePath, "");
                                path        = path.Replace("/", "\\");
                                if (path.StartsWith("\\"))
                                {
                                    rootPath = rootPath + path;
                                }
                                else
                                {
                                    rootPath = rootPath + "\\" + path;
                                }
                            }
                            else
                            {
                                var button = MessageBox.Show($"{RemovePath} not found in path, Do you wanne continue with all contint in the root folder.",
                                                             "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                                if (button == DialogResult.Cancel)
                                {
                                    workQueue.Abort();
                                    return;
                                }
                            }
                        }


                        pathMapper.SetProjectPath(rootProject.PhysicalName, rootPath, rootProject.Path);
                    }
                }
                var changesets = changesetBuilder.Changesets;

                // create a log of all MoveFrom and MoveTo actions
                logger.WriteSectionSeparator();
                logger.WriteLine("List of Move Operations");
                logger.WriteSectionSeparator();

                int changeSetNo = 0;
                int revisionNo  = 0;
                foreach (var changeset in changesets)
                {
                    foreach (var revision in changeset.Revisions)
                    {
                        var actionType     = revision.Action.Type;
                        VssItemName target = null;
                        var namedAction    = revision.Action as VssNamedAction;
                        if (namedAction != null)
                        {
                            target = namedAction.Name;
                        }

                        switch (actionType)
                        {
                        case VssActionType.MoveFrom:
                            var moveFromAction = (VssMoveFromAction)revision.Action;
                            logger.WriteLine("{3}-{4}-{0}: MoveFrom {1} to {2}",
                                             revision.Item, moveFromAction.OriginalProject, target, changeSetNo, revisionNo);
                            break;

                        case VssActionType.MoveTo:
                            var moveToAction = (VssMoveToAction)revision.Action;
                            logger.WriteLine("{3}-{4}-{0}: MoveTo {1} from {2}",
                                             revision.Item, moveToAction.NewProject, target, changeSetNo, revisionNo);
                            break;
                        }
                        revisionNo++;
                    }
                    changeSetNo++;
                    //AdvancedTaskbar.SetPosition((uint)changeSetNo);
                }

                // replay each changeset
                logger.WriteSectionSeparator();
                logger.WriteLine("Replaying Changesets");

                var changesetId     = 0;
                var commitCount     = 0;
                var tagCount        = 0;
                var replayStopwatch = new Stopwatch();
                var labels          = new LinkedList <Revision>();
                tagsUsed.Clear();

                bool found = continueAfter == null;

                foreach (var changeset in changesets)
                {
                    ++changesetId;
                    if (workQueue.IsAborting)
                    {
                        return;
                    }

                    if (!found)
                    {
                        if (continueAfter.Equals(changeset.DateTime))
                        {
                            found = true;
                        }
                        SkipChangeset(pathMapper, changeset);
                        continue;
                    }

                    var changesetDesc = string.Format("changeset {0} from {1:yyyy-MM-dd HH:mm:ss}", changesetId, changeset.DateTime);

                    // replay each revision in changeset
                    logger.WriteSectionSeparator();
                    LogStatus(work, "Replaying " + changesetDesc);
                    labels.Clear();
                    replayStopwatch.Start();
                    try
                    {
                        ReplayChangeset(pathMapper, changeset, labels);
                        if (makeInitialCommit)
                        {
                            vcsWrapper.Init(changeset, repoPath);
                            makeInitialCommit = false;
                        }
                        vcsWrapper.NeedsCommit(); // to flush outstanding adds/deletes
                    }
                    finally
                    {
                        replayStopwatch.Stop();
                    }

                    if (workQueue.IsAborting)
                    {
                        return;
                    }

                    // commit changes
                    if (vcsWrapper.NeedsCommit())
                    {
                        LogStatus(work, "Committing " + changesetDesc);
                        if (CommitChangeset(changeset))
                        {
                            ++commitCount;
                        }
                    }

                    // create tags for any labels in the changeset
                    if (labels.Count > 0)
                    {
                        foreach (Revision label in labels)
                        {
                            var labelName = ((VssLabelAction)label.Action).Label;
                            if (string.IsNullOrEmpty(labelName))
                            {
                                logger.WriteLine("NOTE: Ignoring empty label");
                            }
                            else if (commitCount == 0)
                            {
                                logger.WriteLine("NOTE: Ignoring label '{0}' before initial commit", labelName);
                            }
                            else
                            {
                                //Datell B.V. Specific operation of adding folder structure to label.
                                //It is optional by using the checkbox
                                if (FolderBeforeLabel && label.Item.IsProject)
                                {
                                    labelName = pathMapper.GetProjectPath(label.Item.PhysicalName) + "_" + labelName;
                                    labelName = labelName.Replace(repoPath, "").TrimStart('\\');
                                }

                                var tagName = GetTagFromLabel(labelName);

                                var tagMessage = "Creating tag " + tagName;
                                if (tagName != labelName)
                                {
                                    tagMessage += " for label '" + labelName + "'";
                                }
                                LogStatus(work, tagMessage);

                                // tags always get a tag message;
                                var tagComment = label.Comment;
                                if (string.IsNullOrEmpty(tagComment))
                                {
                                    // use the original VSS label as the tag message if none was provided
                                    tagComment = labelName;
                                }

                                if (AbortRetryIgnore(
                                        delegate
                                {
                                    vcsWrapper.Tag(tagName, label.User, GetEmail(label.User),
                                                   tagComment, label.DateTime);
                                }))
                                {
                                    ++tagCount;
                                }
                            }
                        }
                    }
                    AdvancedTaskbar.SetPosition((uint)changesetId);
                }

                stopwatch.Stop();

                if (!found)
                {
                    logger.WriteLine("Cannot Sync: VSS changeset at {0} not found.", continueAfter);
                    throw new ProcessException(string.Format("Cannot Sync: VSS changeset at {0} not found.", continueAfter), null, null);
                }

                logger.WriteSectionSeparator();
                logger.WriteLine(vcs + " export complete in {0:HH:mm:ss}", new DateTime(stopwatch.ElapsedTicks));
                logger.WriteLine("Replay time: {0:HH:mm:ss}", new DateTime(replayStopwatch.ElapsedTicks));
                logger.WriteLine(vcs + " time: {0:HH:mm:ss}", new DateTime(vcsWrapper.ElapsedTime().Ticks));
                logger.WriteLine(vcs + " commits: {0}", commitCount);
                logger.WriteLine(vcs + " tags: {0}", tagCount);
            });
        }