Пользовательская политика регистрации в TFS?

У нас есть несколько xml-файлов в нашем проекте, и всякий раз, когда мы регистрируем эти xml-файлы в TFS, перед регистрацией мы должны убедиться, что мы добавили эти xml-файлы в проприетарное приложение.

Сейчас новые сотрудники все чаще забывают добавлять файлы в проприетарное приложение перед регистрацией, и это уже серьезно...

Нам нужен своего рода диалог подтверждения (напоминание), спрашивающий разработчиков, добавили ли они xml-файлы в приложение. Если да, то зарегистрируйтесь, в противном случае оставьте его проверенным...

Пожалуйста, предложите, возможно ли это, и любой соответствующий код или ссылки будут действительно оценены.


person Dexterslab    schedule 26.05.2011    source источник


Ответы (3)


Нецелесообразно поднимать пользовательский интерфейс в настраиваемой политике возврата — жизненный цикл политики возврата очень короткий, и они будут оцениваться часто и не обязательно в контексте пользовательского интерфейса или в потоке пользовательского интерфейса.

Можете ли вы программно определить, возвращаются ли соответствующие XML-файлы? Если это так, вы можете создать пользовательскую политику возврата, которая не будет работать, если XML-файлы не ожидают добавления.

Gated Check-in может быть лучшим решением этой проблемы: будет ли сборка неудачной, если эти XML-файлы не существуют, или не будут ли модульные тесты неудачными, если эти файлы отсутствуют? Если это так, то это идеальный кандидат для Gated Check-in, который предотвратит эти регистрации.

person Edward Thomson    schedule 26.05.2011
comment
Большое спасибо за ваш ответ ... Я боюсь, что это не приведет к сбою сборки и сбою модульного теста, если эти файлы XML отсутствуют ... - person Dexterslab; 26.05.2011
comment
В этом случае я бы рассмотрел возможность использования рабочих элементов для этого - в конце концов, вы пытаетесь убедиться, что ваши разработчики выполнили определенный объем работы (в данном случае проверка файлов XML). - person Edward Thomson; 26.05.2011
comment
хмммм, да, но это не похоже на работу, которую я хотел бы отслеживать в виде рабочего элемента. Это похоже на то, когда разработчик регистрирует файл xml. xml в проприетарном приложении (пользовательское приложение не имеет ничего общего с TFS). Итак, чтобы сделать его более понятным, эти XML добавляются в 2 разных приложения. (1) проект .net, в котором используется TFS (2) пользовательское проприетарное приложение - person Dexterslab; 26.05.2011
comment
Да, я понимаю, я бы предпочел найти способ запросить проприетарное приложение, чтобы узнать, были ли добавлены эти XML-файлы, а затем написать политику проверки, которая выполняет этот запрос и терпит неудачу, если проприетарное приложение их не имеет. . За исключением этой способности, все будет немного взломано. Я могу понять сомнения по поводу рабочих элементов — другая идея состоит в том, чтобы потребовать от пользователя добавить некоторые другие данные к регистрации, чтобы доказать, что они выполнили это требование, например, добавив фразу XML ADDED в своем комментарии, а потом проверяя на это. - person Edward Thomson; 26.05.2011
comment
Мне нравится ваша идея XML ДОБАВЛЕНО. Могу ли я иметь необходимый элемент управления DropDownList вместо текстового поля комментария? .. Я ценю ваше время .. Спасибо! - person Dexterslab; 26.05.2011
comment
К сожалению, нет, вы не можете заменить текстовое поле комментария другим элементом управления. - person Edward Thomson; 27.05.2011
comment
Не могли бы вы использовать метод Activate для отображения пользовательского интерфейса в политике регистрации? Это вызовет предупреждение на экране регистрации, а затем отобразит пользовательский интерфейс, когда пользователь взаимодействует с сообщением. - person jessehouwing; 31.01.2014
comment
Это очень умно @jessehouwing. Я не помню жизненный цикл навскидку, поэтому хочу убедиться, что понимаю: вы предлагаете отказаться от политики, затем, когда пользователь открывает политику для получения подробной информации, в методе Activate вы можете подсказать пользователю, и если его ответ будет удовлетворительно, вы можете пройти оценку политики регистрации в будущем? - person Edward Thomson; 31.01.2014
comment
Добавлен образец политики в качестве отдельного ответа. - person jessehouwing; 31.01.2014
comment
@EdwardThomson Я попробовал, и это работает, см. мой другой ответ и мой небольшой проект на github. - person jessehouwing; 17.02.2014

Я бы создал собственный шаблон сборки, который проверяет эти xml-файлы. Сделайте это закрытой регистрацией, и у вас есть решение.

person LeWoody    schedule 26.05.2011
comment
Я бы сделал это в дополнение к политике. - person jessehouwing; 31.01.2014

Предполагается, что метод Evaluate должен быть быстрым и не должен отображать пользовательский интерфейс, но в политике есть событие, которое срабатывает, когда пользователь взаимодействует с политикой, называемой Activate, это хороший момент для отображения пользовательского интерфейса и взаимодействия с политикой. Вы можете сделать что-то вроде этого:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JesseHouwing.CheckinPolicies
{
    using System.Windows.Forms;

    using Microsoft.TeamFoundation.Client.Reporting;
    using Microsoft.TeamFoundation.VersionControl.Client;

    [Serializable]
    public class ConfirmPolicy :PolicyBase
    {
        private AffectedTeamProjectsEventHandler _affectedTeamProjectsEventHandler;
        private EventHandler _checkedPendingChangesEventHandler;

        public ConfirmPolicy()
        {
        }

        public void StatusChanged()
        {
            _userconfirmed = false;
            OnPolicyStateChanged(Evaluate());
        }

        public override void Initialize(IPendingCheckin pendingCheckin)
        {
            _affectedTeamProjectsEventHandler = (sender, e) => StatusChanged();
            _checkedPendingChangesEventHandler = (sender, e) => StatusChanged();

            base.Initialize(pendingCheckin);
            _userconfirmed = false;                
            pendingCheckin.PendingChanges.AffectedTeamProjectsChanged += _affectedTeamProjectsEventHandler;
            pendingCheckin.PendingChanges.CheckedPendingChangesChanged += _checkedPendingChangesEventHandler;
        }

        protected override void OnPolicyStateChanged(PolicyFailure[] failures)
        {
            _userconfirmed = false;
            base.OnPolicyStateChanged(Evaluate());
        }

        public override void Activate(PolicyFailure failure)
        {
            if (MessageBox.Show("Confirm the policy?", "Policy Check", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                _userconfirmed = true;
                base.OnPolicyStateChanged(Evaluate());
            }
        }

        public override PolicyFailure[] Evaluate()
        {
            if (_userconfirmed == true)
            {
                return new PolicyFailure[0];
            }
            else
            {
                return new PolicyFailure[]{new PolicyFailure("User must confirm", this)};
            }
        }

        public override string Description
        {
            get { throw new NotImplementedException(); }
        }

        public override bool Edit(IPolicyEditArgs policyEditArgs)
        {
            return true;
        }

        public override string Type
        {
            get
            {
                return "User Confirm";
            }
        }

        public override string TypeDescription
        {
            get
            {
                return "User Confirm";
            }
        }

        public override void Dispose()
        {
            this.PendingCheckin.PendingChanges.AffectedTeamProjectsChanged -= _affectedTeamProjectsEventHandler;
            this.PendingCheckin.PendingChanges.CheckedPendingChangesChanged -= _checkedPendingChangesEventHandler;

            base.Dispose();
        }
    }
}

Я еще не тестировал этот точный код, возможно, он нуждается в некоторой настройке, но это обычное дело. Прямо сейчас он срабатывает при изменении возвращаемых файлов, но вы также можете подписаться на любое другое событие (изменение рабочего элемента) или инициировать собственную оценку проекта каждый раз, когда вызывается Evaluate.

Или вы можете просто инициировать подтверждение один раз за цикл регистрации. это все зависит от вас. Вы даже можете сделать «Нажмите, чтобы закрыть» и вообще пропустить Messagebox. Просто установите _userConfirmed=true и запустите событие PolicyStateChanged.

person jessehouwing    schedule 31.01.2014
comment
Я реализовал это в одной из своих собственных политик, она опубликована здесь: github.com/jessehouwing/tfstools/blob/master/ - person jessehouwing; 17.02.2014