private WorkItemLinkTypeEnd ParseLinkEnd(WiLink link, WorkItem wi)
        {
            var props    = link.WiType?.Split('-');
            var linkType = wi.Project.Store.WorkItemLinkTypes.SingleOrDefault(lt => lt.ReferenceName == props?[0]);

            if (linkType == null)
            {
                Logger.Log(LogLevel.Error, $"'{link.ToString()}' - link type ({props?[0]}) does not exist in project");
                return(null);
            }

            WorkItemLinkTypeEnd linkEnd = null;

            if (linkType.IsDirectional)
            {
                if (props?.Length > 1)
                {
                    linkEnd = props[1] == "Forward" ? linkType.ForwardEnd : linkType.ReverseEnd;
                }
                else
                {
                    Logger.Log(LogLevel.Error, $"'{link.ToString()}' - link direction not provided for '{wi.Id}'.");
                }
            }
            else
            {
                linkEnd = linkType.ForwardEnd;
            }

            return(linkEnd);
        }
        private void AddSingleLink(JiraRevision r, List <WiLink> links, string field, string type)
        {
            if (r.Fields.TryGetValue(field, out object value))
            {
                var changeType = value == null ? ReferenceChangeType.Removed : ReferenceChangeType.Added;
                var linkType   = (from t in _config.LinkMap.Links where t.Source == type select t.Target).FirstOrDefault();

                if (changeType == ReferenceChangeType.Added)
                {
                    string linkedItemKey = (string)value;

                    if (string.IsNullOrEmpty(linkType))
                    {
                        Logger.Log(LogLevel.Warning, $"Cannot add 'Child' {linkedItemKey} link to 'Parent' {r.ParentItem.Key}, 'Child' link-map configuration missing.");
                        return;
                    }

                    var link = new WiLink()
                    {
                        Change         = changeType,
                        SourceOriginId = r.ParentItem.Key,
                        TargetOriginId = linkedItemKey,
                        WiType         = linkType,
                    };

                    links.Add(link);
                }
            }
        }
        private bool AddLink(WiLink link, WorkItem wi)
        {
            var linkEnd = ParseLinkEnd(link, wi);

            if (linkEnd != null)
            {
                try
                {
                    var relatedLink = new RelatedLink(linkEnd, link.TargetWiId);
                    relatedLink = ResolveCiclycalLinks(relatedLink, wi);
                    if (!IsDuplicateWorkItemLink(wi.Links, relatedLink))
                    {
                        wi.Links.Add(relatedLink);
                        return(true);
                    }
                    return(false);
                }

                catch (Exception ex)
                {
                    Logger.Log(LogLevel.Error, ex.Message);
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
Esempio n. 4
0
        private void AddSingleLink(JiraRevision r, List <WiLink> links, string field, string type)
        {
            if (r.Fields.TryGetValue(field, out object value))
            {
                var changeType = value == null ? ReferenceChangeType.Removed : ReferenceChangeType.Added;
                var linkType   = (from t in _config.LinkMap.Links where t.Source == type select t.Target).FirstOrDefault();

                // regardless if action is add or remove, as there can be only one, we remove previous epic link if it exists

                if (changeType == ReferenceChangeType.Added)
                {
                    string linkedItemKey = (string)value;

                    var link = new WiLink()
                    {
                        Change         = changeType,
                        SourceOriginId = r.ParentItem.Key,
                        TargetOriginId = linkedItemKey,
                        WiType         = linkType,
                    };

                    links.Add(link);
                }
            }
        }
        private bool RemoveLink(WiLink link, WorkItem wi)
        {
            var linkToRemove = wi.Links.OfType <RelatedLink>().SingleOrDefault(rl => rl.LinkTypeEnd.ImmutableName == link.WiType && rl.RelatedWorkItemId == link.TargetWiId);

            if (linkToRemove == null)
            {
                Logger.Log(LogLevel.Warning, $"{link.ToString()} - cannot identify link to remove for '{wi.Id}'.");
                return(false);
            }
            wi.Links.Remove(linkToRemove);
            return(true);
        }
Esempio n. 6
0
        private bool AddLink(WiLink link, WorkItem wi)
        {
            var linkEnd = ParseLinkEnd(link, wi);

            if (linkEnd != null)
            {
                var relatedLink = new RelatedLink(linkEnd, link.TargetWiId);
                relatedLink = ResolveCiclycalLinks(relatedLink, wi);
                wi.Links.Add(relatedLink);
                return(true);
            }
            else
            {
                return(false);
            }
        }
Esempio n. 7
0
        private List <WiLink> MapLinks(JiraRevision r)
        {
            var links = new List <WiLink>();

            if (r.LinkActions == null)
            {
                return(links);
            }

            // map issue links
            foreach (var jiraLinkAction in r.LinkActions)
            {
                var changeType = jiraLinkAction.ChangeType == RevisionChangeType.Added ? ReferenceChangeType.Added : ReferenceChangeType.Removed;

                var link = new WiLink();

                if (_config.LinkMap.Links != null)
                {
                    var linkType = (from t in _config.LinkMap.Links where t.Source == jiraLinkAction.Value.LinkType select t.Target).FirstOrDefault();

                    if (linkType != null)
                    {
                        link.Change         = changeType;
                        link.SourceOriginId = jiraLinkAction.Value.SourceItem;
                        link.TargetOriginId = jiraLinkAction.Value.TargetItem;
                        link.WiType         = linkType;

                        links.Add(link);
                    }
                }
            }

            // map epic link
            AddRemoveSingleLink(r, links, _jiraProvider.Settings.EpicLinkField, "Epic");

            // map parent
            AddRemoveSingleLink(r, links, "parent", "Parent");

            // map epic child
            MapEpicChildLink(r, links, "epic child", "Child");


            return(links);
        }
        /// <summary>
        /// Add or remove single link
        /// </summary>
        /// <param name="r"></param>
        /// <param name="links"></param>
        /// <param name="field"></param>
        /// <param name="type"></param>
        /// <returns>True if link is added, false if it's not</returns>
        private void AddRemoveSingleLink(JiraRevision r, List <WiLink> links, string field, string type)
        {
            if (r.Fields.TryGetValue(field, out object value))
            {
                var changeType = value == null ? ReferenceChangeType.Removed : ReferenceChangeType.Added;
                var linkType   = (from t in _config.LinkMap.Links where t.Source == type select t.Target).FirstOrDefault();

                // regardless if action is add or remove, as there can be only one, we remove previous epic link if it exists
                if (r.Index != 0)
                {
                    var prevLinkValue = r.ParentItem.Revisions[r.Index - 1].GetFieldValue(field);
                    // if previous value is not null, add removal of previous link
                    if (!string.IsNullOrWhiteSpace(prevLinkValue))
                    {
                        var removeLink = new WiLink()
                        {
                            Change         = ReferenceChangeType.Removed,
                            SourceOriginId = r.ParentItem.Key,
                            TargetOriginId = prevLinkValue,
                            WiType         = linkType
                        };

                        links.Add(removeLink);
                    }
                }

                if (changeType == ReferenceChangeType.Added)
                {
                    string linkedItemKey = (string)value;

                    var link = new WiLink()
                    {
                        Change         = changeType,
                        SourceOriginId = r.ParentItem.Key,
                        TargetOriginId = linkedItemKey,
                        WiType         = linkType,
                    };

                    links.Add(link);
                }
            }
        }