/// <summary> /// Registers a <see cref="Filter"/> to be invoked when <see cref="Filter.Name"/> matches .gitattributes 'filter=name' /// </summary> /// <param name="filter">The filter to be invoked at run time.</param> /// <param name="priority">The priroty of the filter to invoked. /// A value of 0 (<see cref="FilterRegistration.FilterPriorityMin"/>) will be run first on checkout and last on checkin. /// A value of 200 (<see cref="FilterRegistration.FilterPriorityMax"/>) will be run last on checkout and first on checkin. /// </param> /// <returns>A <see cref="FilterRegistration"/> object used to manage the lifetime of the registration.</returns> public static FilterRegistration RegisterFilter(Filter filter, int priority) { Ensure.ArgumentNotNull(filter, "filter"); if (priority < FilterRegistration.FilterPriorityMin || priority > FilterRegistration.FilterPriorityMax) { throw new ArgumentOutOfRangeException("priority", priority, String.Format(System.Globalization.CultureInfo.InvariantCulture, "Filter priorities must be within the inclusive range of [{0}, {1}].", FilterRegistration.FilterPriorityMin, FilterRegistration.FilterPriorityMax)); } FilterRegistration registration = null; lock (registeredFilters) { // if the filter has already been registered if (registeredFilters.ContainsKey(filter)) { throw new EntryExistsException("The filter has already been registered.", GitErrorCode.Exists, GitErrorCategory.Filter); } // allocate the registration object registration = new FilterRegistration(filter, priority); // add the filter and registration object to the global tracking list registeredFilters.Add(filter, registration); } return(registration); }
/// <summary> /// Takes a snapshot of the currently registered filters. /// </summary> /// <returns>An array of <see cref="FilterRegistration"/>.</returns> public static IEnumerable <FilterRegistration> GetRegisteredFilters() { lock (registeredFilters) { FilterRegistration[] array = new FilterRegistration[registeredFilters.Count]; registeredFilters.Values.CopyTo(array, 0); return(array); } }
/// <summary> /// Unregisters the associated filter. /// </summary> /// <param name="registration">Registration object with an associated filter.</param> public static void DeregisterFilter(FilterRegistration registration) { Ensure.ArgumentNotNull(registration, "registration"); lock (registeredFilters) { var filter = registration.Filter; // do nothing if the filter isn't registered if (registeredFilters.ContainsKey(filter)) { // remove the register from the global tracking list registeredFilters.Remove(filter); // clean up native allocations registration.Free(); } } }