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); } }
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); }
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); } }
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); } } }