ठीक है ... मुझे लगता है कि मुझे इसका समाधान मिला है, हालांकि यह उलझन में है और सच कहा जाता है कि मुझे बिल्कुल यकीन नहीं है कि यह कैसे काम करता है। लेकिन यहां जाता है - शायद यह किसी को सही दिशा में इंगित करेगा।
var associatedWorkItems = new List<WorkItem>();
//Passed in from the build workflow (this variable is available under the 'Run On Agent' sequence as 'associatedChangesets'
IList<Changeset> associatedChangesets = context.GetValue(BuildAssociatedChangesets);
if (associatedChangesets.Count > 0)
{
var projectCollection =
new TfsTeamProjectCollection(new Uri("http://localhost:8080/tfs/DefaultCollection"));
VersionControlServer versionControlServer = projectCollection.GetService<VersionControlServer>();
foreach (var changeset in associatedChangesets)
{
//In order to view the individual changes, load the changeset directly from the VCS.
Changeset localChangeset = versionControlServer.GetChangeset(changeset.ChangesetId);
foreach (Change change in localChangeset.Changes)
{
//Find out what was merged in.
ChangesetMerge[] mergedChangesets = versionControlServer.QueryMerges(
null,
null,
change.Item.ServerItem,
new ChangesetVersionSpec(localChangeset.ChangesetId),
new ChangesetVersionSpec(localChangeset.ChangesetId),
null,
RecursionType.Full);
//Extract work item information from changesets being identified as merged.
foreach (var changesetMerge in mergedChangesets)
{
Changeset actualChange = versionControlServer.GetChangeset(changesetMerge.SourceVersion);
foreach (WorkItem item in actualChange.WorkItems)
{
if (!associatedWorkItems.Exists(w => w.Id == item.Id))
{
associatedWorkItems.Add(item);
}
}
}
}
}
}
मुझे मत पूछो वास्तव में कैसे काम करता है QueryMerges लेकिन सभी मैं यहाँ कर रहा हूँ यह मुझे दिखा क्या क्या एक changeset में जाँच के एक भाग के रूप में विलय कर दिया कह। आपको लगता है कि मानकों ChangesetVersionSpec ही कर रहे हैं पर ध्यान देंगे - इसका मतलब है कि हम सिर्फ इस बदलाव से विलय कर रहे हैं।
आप QueryMerges() से ChangesetMerge ऑब्जेक्ट्स की एक सरणी वापस प्राप्त करेंगे। ChangesetMerge क्लास में SourceVersion नामक एक प्रॉपर्टी है - यह मूल परिवर्तन के ChangesetId में विलय हो गया है। एक बार हमें यह पता चला है कि हम व्यक्तिगत सेट लोड करने और वर्कआईटम निकालने के लिए VersionControlServer.GetChangeset() विधि का उपयोग कर सकते हैं। इसके बाद इसे वर्कइटम की एक सूची में जोड़ा जाता है जिसे आप चाहते हैं (मेरे मामले में एक ईमेल) में छेड़छाड़ की जा सकती है। मैंने यह भी सुनिश्चित करने के लिए .xists() जांच का उपयोग किया है कि वही वर्कइटम दो बार रिकॉर्ड नहीं होता है।
ध्यान दें कि भले ही आपके पास बिल्ड वर्कफ़्लो से 'संबद्ध चेंजसेट्स' संग्रह है, कुछ कारणों से (मेरे लिए कम से कम), 'जुड़े चेंजसेट्स' के अंदर परिवर्तन [] संपत्ति कभी पॉप्युलेट नहीं हुई थी (इसलिए प्रत्येक व्यक्तिगत परिवर्तन को लोड करना VersionControlServer.GetChangeset() विधि वास्तव में हमें आवश्यक सभी फ़ील्ड को पॉप्युलेट करने लगती है।
जैसा कि मैंने कहा, 1. यह एक घबराहट समाधान है (लूपिंग के बहुत सारे - जिनमें से कुछ शायद अनावश्यक है), 2. मैं नहीं करता यह पूरी तरह से समझ में नहीं आता है कि यह कैसे काम करता है हालांकि यह आवश्यक परिणाम उत्पन्न करता है - मैं इस निष्कर्ष पर बहुत परीक्षण और डिबगिंग करके आया था) और आखिरकार - माइक्रोसॉफ्ट द्वारा प्रदान किए गए दुखी दस्तावेज के आधार पर यह सबसे अच्छा हो सकता है।
उम्मीद है कि यह किसी की मदद करेगी!
स्रोत
2011-09-28 08:53:38
क्या यह एक डुप्लिकेट/सबसेट हो सकता है: http://stackoverflow.com/questions/7536323/how-to-determine-the-work-items-fixed-in-a-particular-tfs-build-when उपयोग करना शाखा – pantelif