diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/analytics/shared/constants.js | 15 | ||||
-rw-r--r-- | app/assets/javascripts/gfm_auto_complete.js | 2 | ||||
-rw-r--r-- | app/models/bulk_imports/entity.rb | 10 | ||||
-rw-r--r-- | app/models/bulk_imports/export_status.rb | 4 | ||||
-rw-r--r-- | app/models/bulk_imports/tracker.rb | 37 | ||||
-rw-r--r-- | app/models/concerns/time_trackable.rb | 8 | ||||
-rw-r--r-- | app/services/bulk_imports/relation_export_service.rb | 7 |
7 files changed, 80 insertions, 3 deletions
diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js index e48281a7453..1d4a0e07051 100644 --- a/app/assets/javascripts/analytics/shared/constants.js +++ b/app/assets/javascripts/analytics/shared/constants.js @@ -122,6 +122,12 @@ export const MERGE_REQUEST_METRICS = { THROUGHPUT: MERGE_REQUEST_THROUGHPUT_TYPE, }; +export const CONTRIBUTOR_COUNT_TYPE = 'contributor_count'; + +export const CONTRIBUTOR_METRICS = { + COUNT: CONTRIBUTOR_COUNT_TYPE, +}; + export const METRIC_TOOLTIPS = { [DORA_METRICS.DEPLOYMENT_FREQUENCY]: { description: s__( @@ -193,6 +199,15 @@ export const METRIC_TOOLTIPS = { projectLink: '-/analytics/merge_request_analytics', docsLink: helpPagePath('user/analytics/merge_request_analytics'), }, + [CONTRIBUTOR_METRICS.COUNT]: { + description: s__( + 'ValueStreamAnalytics|Number of monthly unique users with contributions in the group.', + ), + groupLink: '-/contribution_analytics', + docsLink: helpPagePath('user/profile/contributions_calendar.html', { + anchor: 'user-contribution-events', + }), + }, [VULNERABILITY_METRICS.CRITICAL]: { description: s__('ValueStreamAnalytics|Critical vulnerabilities over time.'), groupLink: '-/security/vulnerabilities?severity=CRITICAL', diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js index 57c82d34548..f08cccc1865 100644 --- a/app/assets/javascripts/gfm_auto_complete.js +++ b/app/assets/javascripts/gfm_auto_complete.js @@ -219,7 +219,7 @@ class GfmAutoComplete { let tpl = '/${name} '; let referencePrefix = null; if (value.params.length > 0) { - const regexp = /\[[a-z]+:/; + const regexp = /^<\[[a-z]+:/; const match = regexp.exec(value.params); if (match) { [referencePrefix] = match; diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb index a6969ce6f76..5e4990b0bc9 100644 --- a/app/models/bulk_imports/entity.rb +++ b/app/models/bulk_imports/entity.rb @@ -207,6 +207,16 @@ class BulkImports::Entity < ApplicationRecord @source_version ||= bulk_import.source_version_info end + def checksums + trackers.each_with_object({}) do |tracker, checksums| + next unless tracker.file_extraction_pipeline? + next if tracker.skipped? + next if tracker.checksums_empty? + + checksums.merge!(tracker.checksums) + end + end + private def validate_parent_is_a_group diff --git a/app/models/bulk_imports/export_status.rb b/app/models/bulk_imports/export_status.rb index 9e3815e7569..5da9298e489 100644 --- a/app/models/bulk_imports/export_status.rb +++ b/app/models/bulk_imports/export_status.rb @@ -46,6 +46,10 @@ module BulkImports status['batches'].find { |item| item['batch_number'] == batch_number } end + def total_objects_count + status['total_objects_count'] + end + private attr_reader :client, :entity, :relation, :pipeline_tracker diff --git a/app/models/bulk_imports/tracker.rb b/app/models/bulk_imports/tracker.rb index b5092591019..334438c74cd 100644 --- a/app/models/bulk_imports/tracker.rb +++ b/app/models/bulk_imports/tracker.rb @@ -86,5 +86,42 @@ class BulkImports::Tracker < ApplicationRecord event :cleanup_stale do transition [:created, :started] => :timeout end + + after_transition any => [:finished, :failed] do |tracker| + BulkImports::ObjectCounter.persist!(tracker) + end + end + + def checksums + return unless file_extraction_pipeline? + + # Return cached counters until they expire + { importing_relation => cached_checksums || persisted_checksums } + end + + def checksums_empty? + return true unless checksums + + sums = checksums[importing_relation] + + sums[:source] == 0 && sums[:fetched] == 0 && sums[:imported] == 0 + end + + def importing_relation + pipeline_class.relation.to_sym + end + + private + + def cached_checksums + BulkImports::ObjectCounter.summary(self) + end + + def persisted_checksums + { + source: source_objects_count, + fetched: fetched_objects_count, + imported: imported_objects_count + } end end diff --git a/app/models/concerns/time_trackable.rb b/app/models/concerns/time_trackable.rb index 70bc45b382a..b90c938c5f8 100644 --- a/app/models/concerns/time_trackable.rb +++ b/app/models/concerns/time_trackable.rb @@ -32,6 +32,7 @@ module TimeTrackable @spent_at = options[:spent_at] @summary = options[:summary] @original_total_time_spent = nil + @category_id = category_id(options[:category]) return if @time_spent == 0 @@ -94,7 +95,8 @@ module TimeTrackable note_id: @time_spent_note_id, user: @time_spent_user, spent_at: @spent_at, - summary: @summary + summary: @summary, + timelog_category_id: @category_id ) end # rubocop:enable Gitlab/ModuleWithInstanceVariables @@ -119,4 +121,8 @@ module TimeTrackable errors.add(:time_estimate, _('must have a valid format and be greater than or equal to zero.')) end + + def category_id(category) + TimeTracking::TimelogCategory.find_by_name(project.root_namespace, category).first&.id + end end diff --git a/app/services/bulk_imports/relation_export_service.rb b/app/services/bulk_imports/relation_export_service.rb index 6db5ef3e9ec..ea3b8adad74 100644 --- a/app/services/bulk_imports/relation_export_service.rb +++ b/app/services/bulk_imports/relation_export_service.rb @@ -82,7 +82,12 @@ module BulkImports end def finish_export!(export) - export.update!(status_event: 'finish', batched: false, error: nil) + export.update!( + status_event: 'finish', + batched: false, + error: nil, + total_objects_count: export_service.exported_objects_count + ) end def exported_filepath |