예제 #1
0
        internal void UpdateGroups()
        {
            IMergeRequestCache mergeRequestCache = _dataCache?.MergeRequestCache;

            if (mergeRequestCache == null)
            {
                return;
            }

            BeginUpdate();

            // Add missing project groups
            IEnumerable <ProjectKey> allProjects = mergeRequestCache.GetProjects();

            foreach (ProjectKey projectKey in allProjects)
            {
                if (!Groups.Cast <ListViewGroup>().Any(x => projectKey.Equals((ProjectKey)(x.Tag))))
                {
                    CreateGroupForProject(projectKey, true);
                }
            }

            // Remove deleted project groups
            for (int index = Groups.Count - 1; index >= 0; --index)
            {
                ListViewGroup group = Groups[index];
                if (!allProjects.Any(x => x.Equals((ProjectKey)group.Tag)))
                {
                    Groups.Remove(group);
                }
            }

            EndUpdate();
        }
예제 #2
0
        internal GitDataUpdater(
            IMergeRequestCache mergeRequestCache,
            IDiscussionCache discussionCache,
            ISynchronizeInvoke synchronizeInvoke,
            ILocalCommitStorageFactory gitFactory,
            int autoUpdatePeriodMs,
            MergeRequestFilter mergeRequestFilter,
            bool isInitialUpdateNeeded)
            : base(mergeRequestCache, discussionCache, synchronizeInvoke, gitFactory)
        {
            if (autoUpdatePeriodMs < 1)
            {
                throw new ArgumentException("Bad auto-update period specified");
            }
            _mergeRequestFilter = mergeRequestFilter;

            _timer = new System.Timers.Timer {
                Interval = autoUpdatePeriodMs
            };
            _timer.Elapsed            += onTimer;
            _timer.SynchronizingObject = synchronizeInvoke;
            _timer.Start();

            if (isInitialUpdateNeeded)
            {
                scheduleAllProjectsUpdate();
            }
        }
예제 #3
0
 internal GitBasedDiffStatProvider(
     IMergeRequestCache mergeRequestCache,
     IDiscussionCache discussionCache,
     ISynchronizeInvoke synchronizeInvoke,
     ILocalCommitStorageFactory gitFactory)
     : base(mergeRequestCache, discussionCache, synchronizeInvoke, gitFactory)
 {
     scheduleAllProjectsUpdate();
 }
        private void refreshCommits(IMergeRequestCache mergeRequestCache)
        {
            int prevCommitCount = _commits?.Length ?? 0;

            _commits = mergeRequestCache.GetCommits(_mergeRequestKey).ToArray();

            if (prevCommitCount != _commits.Length)
            {
                traceInformation(String.Format("Changed _commits.Length to {0}", _commits.Length.ToString()));
            }
        }
예제 #5
0
        private DateTime?getRefreshedTime(MergeRequestKey key)
        {
            IMergeRequestCache mergeRequestCache = _dataCache?.MergeRequestCache;

            if (mergeRequestCache == null)
            {
                return(null);
            }

            return(mergeRequestCache.GetMergeRequestRefreshTime(key));
        }
예제 #6
0
        private DateTime?getLatestCommitTime(MergeRequestKey key)
        {
            IMergeRequestCache mergeRequestCache = _dataCache?.MergeRequestCache;

            if (mergeRequestCache == null)
            {
                return(null);
            }

            Commit latestCommit = mergeRequestCache
                                  .GetCommits(key)?
                                  .OrderByDescending(commit => commit.Created_At)
                                  .FirstOrDefault();

            return(latestCommit?.Created_At);
        }
예제 #7
0
        private void onLiveMergeRequestSelectionChanged(FullMergeRequestKey fmk)
        {
            Debug.Assert(fmk.MergeRequest != null && fmk.MergeRequest.IId != 0);

            Trace.TraceInformation(String.Format(
                                       "[MainForm.Workflow] User requested to change merge request to IId {0}",
                                       fmk.MergeRequest.IId.ToString()));

            onSingleMergeRequestLoaded(fmk);

            IMergeRequestCache cache = _liveDataCache.MergeRequestCache;
            MergeRequestKey    mrk   = new MergeRequestKey(fmk.ProjectKey, fmk.MergeRequest.IId);

            GitLabSharp.Entities.Version latestVersion = cache.GetLatestVersion(mrk);
            onComparableEntitiesLoaded(latestVersion, fmk.MergeRequest, cache.GetCommits(mrk), cache.GetVersions(mrk));
        }
예제 #8
0
        internal BaseGitHelper(
            IMergeRequestCache mergeRequestCache,
            IDiscussionCache discussionCache,
            ISynchronizeInvoke synchronizeInvoke,
            ILocalCommitStorageFactory gitFactory)
        {
            _mergeRequestCache = mergeRequestCache;
            _mergeRequestCache.MergeRequestEvent += onMergeRequestEvent;

            _discussionCache = discussionCache;

            _gitFactory = gitFactory;
            if (_gitFactory != null)
            {
                _gitFactory.GitRepositoryCloned += onGitRepositoryCloned;
            }
            _synchronizeInvoke = synchronizeInvoke;
        }
예제 #9
0
        internal DiscussionManager(
            DataCacheContext dataCacheContext,
            string hostname,
            IHostProperties hostProperties,
            User user,
            IMergeRequestCache mergeRequestCache,
            IModificationNotifier modificationNotifier,
            INetworkOperationStatusListener networkOperationStatusListener)
        {
            _operator = new DiscussionOperator(hostname, hostProperties, networkOperationStatusListener);

            _parser = new DiscussionParser(this, dataCacheContext.DiscussionKeywords, user);
            _parser.DiscussionEvent += onDiscussionParserEvent;

            _mergeRequestFilterChecker = dataCacheContext.MergeRequestFilterChecker;
            _tagForLogging             = dataCacheContext.TagForLogging;

            _mergeRequestCache = mergeRequestCache;
            _mergeRequestCache.MergeRequestEvent += OnMergeRequestEvent;
            _modificationNotifier = modificationNotifier;

            _modificationNotifier.DiscussionResolved += onDiscussionResolved;
            _modificationNotifier.DiscussionModified += onDiscussionModified;

            if (dataCacheContext.UpdateRules.UpdateDiscussionsPeriod.HasValue)
            {
                _timer = new System.Timers.Timer
                {
                    Interval = dataCacheContext.UpdateRules.UpdateDiscussionsPeriod.Value
                };
                _timer.Elapsed            += onTimer;
                _timer.SynchronizingObject = dataCacheContext.SynchronizeInvoke;
                _timer.Start();

                scheduleUpdate(null /* update all merge requests cached at the moment of update processing */,
                               DiscussionUpdateType.InitialSnapshot);
            }
        }
예제 #10
0
        internal void UpdateItems()
        {
            IMergeRequestCache mergeRequestCache = _dataCache?.MergeRequestCache;

            if (mergeRequestCache == null)
            {
                return;
            }

            IEnumerable <ProjectKey> projectKeys = Groups.Cast <ListViewGroup>().Select(x => (ProjectKey)x.Tag);

            BeginUpdate();

            // Add missing merge requests and update existing ones
            foreach (ProjectKey projectKey in projectKeys)
            {
                if (isGroupCollapsed(projectKey))
                {
                    continue;
                }
                foreach (FullMergeRequestKey fmk in getAllProjectItems(projectKey))
                {
                    ListViewItem item = Items.Cast <ListViewItem>().FirstOrDefault(
                        x => ((FullMergeRequestKey)x.Tag).Equals(fmk)); // item=`null` if not found
                    if (item == null)
                    {
                        item = createListViewMergeRequestItem(fmk);
                        Items.Add(item);
                    }
                    else
                    {
                        item.Tag = fmk;
                    }
                    setListViewSubItemsTags(item, fmk);
                }
            }

            // Delete summary items from groups that are no longer collapsed
            for (int index = Items.Count - 1; index >= 0; --index)
            {
                FullMergeRequestKey fmk = (FullMergeRequestKey)Items[index].Tag;
                if (!isGroupCollapsed(Items[index].Group) && isSummaryItem(Items[index]))
                {
                    Items.RemoveAt(index);
                }
            }

            // Remove normal items from collapsed groups
            for (int index = Items.Count - 1; index >= 0; --index)
            {
                if (isGroupCollapsed(Items[index].Group))
                {
                    Items.RemoveAt(index);
                }
            }

            // Create summary items
            foreach (ListViewGroup group in Groups)
            {
                if (isGroupCollapsed(group))
                {
                    string[]            subitems = Enumerable.Repeat(String.Empty, Columns.Count).ToArray();
                    FullMergeRequestKey fmk      = new FullMergeRequestKey(getGroupProjectKey(group), null);
                    ListViewItem        item     = createListViewMergeRequestItem(fmk);
                    Items.Add(item);
                    setListViewSubItemsTagsForSummary(item);
                }
            }

            // Remove deleted merge requests
            for (int index = Items.Count - 1; index >= 0; --index)
            {
                FullMergeRequestKey fmk = (FullMergeRequestKey)Items[index].Tag;
                if (!isGroupCollapsed(fmk.ProjectKey) &&
                    !getAllProjectItems(fmk.ProjectKey).Any(x => x.MergeRequest.IId == fmk.MergeRequest.IId))
                {
                    Items.RemoveAt(index);
                }
            }

            // Hide filtered ones
            for (int index = Items.Count - 1; index >= 0; --index)
            {
                FullMergeRequestKey fmk = (FullMergeRequestKey)Items[index].Tag;
                bool isCollapsed        = isGroupCollapsed(fmk.ProjectKey);
                bool removeItem         = false;
                if (isCollapsed)
                {
                    bool isThereAnyMatchingItem = getMatchingFilterProjectItems(fmk.ProjectKey).Any();
                    removeItem = !isThereAnyMatchingItem;
                }
                else
                {
                    bool doesItemMatchFilter = doesMatchFilter(fmk.MergeRequest);
                    removeItem = !doesItemMatchFilter;
                }
                if (removeItem)
                {
                    Items.RemoveAt(index);
                }
            }

            // update a number of MR which is probably displayed
            _suppressSelectionChange = true;
            try
            {
                Groups.Cast <ListViewGroup>().ToList().ForEach(group => updateGroupCaption(group));
            }
            finally
            {
                _suppressSelectionChange = false;
            }

            recalcRowHeightForMergeRequestListView();

            EndUpdate();
        }