mirror of
https://github.com/lukaszraczylo/git-velocity.git
synced 2026-06-30 04:55:21 +00:00
Create meaningful lines calculations.
This commit is contained in:
@@ -15,6 +15,10 @@ type Commit struct {
|
||||
Repository string `json:"repository"` // owner/repo format
|
||||
URL string `json:"url"`
|
||||
|
||||
// Meaningful line counts (excludes comments and whitespace)
|
||||
MeaningfulAdditions int `json:"meaningful_additions"`
|
||||
MeaningfulDeletions int `json:"meaningful_deletions"`
|
||||
|
||||
// Derived fields
|
||||
HasTests bool `json:"has_tests"`
|
||||
}
|
||||
|
||||
@@ -23,6 +23,10 @@ type ContributorMetrics struct {
|
||||
LinesDeleted int `json:"lines_deleted"`
|
||||
FilesChanged int `json:"files_changed"`
|
||||
|
||||
// Meaningful line counts (excludes comments and whitespace)
|
||||
MeaningfulLinesAdded int `json:"meaningful_lines_added"`
|
||||
MeaningfulLinesDeleted int `json:"meaningful_lines_deleted"`
|
||||
|
||||
// PR metrics
|
||||
PRsOpened int `json:"prs_opened"`
|
||||
PRsMerged int `json:"prs_merged"`
|
||||
@@ -97,6 +101,10 @@ type RepositoryMetrics struct {
|
||||
ActiveContributors int `json:"active_contributors"`
|
||||
TotalLinesAdded int `json:"total_lines_added"`
|
||||
TotalLinesDeleted int `json:"total_lines_deleted"`
|
||||
|
||||
// Meaningful line counts (excludes comments and whitespace)
|
||||
TotalMeaningfulLinesAdded int `json:"total_meaningful_lines_added"`
|
||||
TotalMeaningfulLinesDeleted int `json:"total_meaningful_lines_deleted"`
|
||||
}
|
||||
|
||||
// TeamMetrics holds aggregated metrics for a team
|
||||
@@ -127,6 +135,10 @@ type GlobalMetrics struct {
|
||||
TotalLinesAdded int `json:"total_lines_added"`
|
||||
TotalLinesDeleted int `json:"total_lines_deleted"`
|
||||
|
||||
// Meaningful line counts (excludes comments and whitespace)
|
||||
TotalMeaningfulLinesAdded int `json:"total_meaningful_lines_added"`
|
||||
TotalMeaningfulLinesDeleted int `json:"total_meaningful_lines_deleted"`
|
||||
|
||||
// Velocity timeline (weekly granularity)
|
||||
VelocityTimeline *VelocityTimeline `json:"velocity_timeline,omitempty"`
|
||||
}
|
||||
|
||||
@@ -32,6 +32,10 @@ type PullRequest struct {
|
||||
Reviews []Review `json:"reviews,omitempty"`
|
||||
URL string `json:"url"`
|
||||
|
||||
// Meaningful line counts (excludes comments and whitespace)
|
||||
MeaningfulAdditions int `json:"meaningful_additions"`
|
||||
MeaningfulDeletions int `json:"meaningful_deletions"`
|
||||
|
||||
// Derived fields
|
||||
TimeToMerge *time.Duration `json:"time_to_merge,omitempty"`
|
||||
TimeToFirstReview *time.Duration `json:"time_to_first_review,omitempty"`
|
||||
|
||||
@@ -40,6 +40,8 @@ func (c *Calculator) Calculate(metrics *models.GlobalMetrics) *models.GlobalMetr
|
||||
existing.CommitCount += cm.CommitCount
|
||||
existing.LinesAdded += cm.LinesAdded
|
||||
existing.LinesDeleted += cm.LinesDeleted
|
||||
existing.MeaningfulLinesAdded += cm.MeaningfulLinesAdded
|
||||
existing.MeaningfulLinesDeleted += cm.MeaningfulLinesDeleted
|
||||
existing.PRsOpened += cm.PRsOpened
|
||||
existing.PRsMerged += cm.PRsMerged
|
||||
existing.ReviewsGiven += cm.ReviewsGiven
|
||||
@@ -157,9 +159,15 @@ func (c *Calculator) calculateScore(cm *models.ContributorMetrics) models.Score
|
||||
// Commit points
|
||||
breakdown.Commits = cm.CommitCount * points.Commit
|
||||
|
||||
// Line change points
|
||||
breakdown.LineChanges = int(float64(cm.LinesAdded)*points.LinesAdded +
|
||||
float64(cm.LinesDeleted)*points.LinesDeleted)
|
||||
// Line change points - use meaningful lines if configured, otherwise raw counts
|
||||
linesAdded := cm.LinesAdded
|
||||
linesDeleted := cm.LinesDeleted
|
||||
if points.UseMeaningfulLines {
|
||||
linesAdded = cm.MeaningfulLinesAdded
|
||||
linesDeleted = cm.MeaningfulLinesDeleted
|
||||
}
|
||||
breakdown.LineChanges = int(float64(linesAdded)*points.LinesAdded +
|
||||
float64(linesDeleted)*points.LinesDeleted)
|
||||
|
||||
// PR points
|
||||
breakdown.PRs = cm.PRsOpened*points.PROpened + cm.PRsMerged*points.PRMerged
|
||||
|
||||
@@ -748,3 +748,133 @@ func TestContains(t *testing.T) {
|
||||
assert.False(t, contains(slice, "d"))
|
||||
assert.False(t, contains([]string{}, "a"))
|
||||
}
|
||||
|
||||
func TestCalculator_MeaningfulLinesScoring(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
t.Run("uses meaningful lines when enabled", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg := config.DefaultConfig()
|
||||
cfg.Scoring.Enabled = true
|
||||
cfg.Scoring.Points = config.PointsConfig{
|
||||
Commit: 10,
|
||||
LinesAdded: 0.1,
|
||||
LinesDeleted: 0.05,
|
||||
UseMeaningfulLines: true, // Use meaningful lines
|
||||
}
|
||||
calc := NewCalculator(cfg)
|
||||
|
||||
metrics := &models.GlobalMetrics{
|
||||
Repositories: []models.RepositoryMetrics{
|
||||
{
|
||||
FullName: "owner/repo",
|
||||
Contributors: []models.ContributorMetrics{
|
||||
{
|
||||
Login: "user1",
|
||||
CommitCount: 10,
|
||||
LinesAdded: 1000, // Raw lines
|
||||
LinesDeleted: 500,
|
||||
MeaningfulLinesAdded: 800, // Meaningful lines (excluding comments/whitespace)
|
||||
MeaningfulLinesDeleted: 400,
|
||||
RepositoriesContributed: []string{"owner/repo"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
result := calc.Calculate(metrics)
|
||||
|
||||
contributor := result.Repositories[0].Contributors[0]
|
||||
// Line change points should use meaningful lines:
|
||||
// Meaningful: 800 * 0.1 + 400 * 0.05 = 80 + 20 = 100
|
||||
// (Not raw: 1000 * 0.1 + 500 * 0.05 = 100 + 25 = 125)
|
||||
assert.Equal(t, 100, contributor.Score.Breakdown.LineChanges)
|
||||
// Total: Commits (10 * 10 = 100) + Lines (100) = 200
|
||||
assert.Equal(t, 200, contributor.Score.Total)
|
||||
})
|
||||
|
||||
t.Run("uses raw lines when disabled", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg := config.DefaultConfig()
|
||||
cfg.Scoring.Enabled = true
|
||||
cfg.Scoring.Points = config.PointsConfig{
|
||||
Commit: 10,
|
||||
LinesAdded: 0.1,
|
||||
LinesDeleted: 0.05,
|
||||
UseMeaningfulLines: false, // Use raw lines
|
||||
}
|
||||
calc := NewCalculator(cfg)
|
||||
|
||||
metrics := &models.GlobalMetrics{
|
||||
Repositories: []models.RepositoryMetrics{
|
||||
{
|
||||
FullName: "owner/repo",
|
||||
Contributors: []models.ContributorMetrics{
|
||||
{
|
||||
Login: "user1",
|
||||
CommitCount: 10,
|
||||
LinesAdded: 1000, // Raw lines
|
||||
LinesDeleted: 500,
|
||||
MeaningfulLinesAdded: 800, // Meaningful lines (should be ignored)
|
||||
MeaningfulLinesDeleted: 400,
|
||||
RepositoriesContributed: []string{"owner/repo"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
result := calc.Calculate(metrics)
|
||||
|
||||
contributor := result.Repositories[0].Contributors[0]
|
||||
// Line change points should use raw lines:
|
||||
// Raw: 1000 * 0.1 + 500 * 0.05 = 100 + 25 = 125
|
||||
assert.Equal(t, 125, contributor.Score.Breakdown.LineChanges)
|
||||
// Total: Commits (10 * 10 = 100) + Lines (125) = 225
|
||||
assert.Equal(t, 225, contributor.Score.Total)
|
||||
})
|
||||
|
||||
t.Run("comment-only changes score zero meaningful lines", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg := config.DefaultConfig()
|
||||
cfg.Scoring.Enabled = true
|
||||
cfg.Scoring.Points = config.PointsConfig{
|
||||
Commit: 10,
|
||||
LinesAdded: 0.1,
|
||||
LinesDeleted: 0.05,
|
||||
UseMeaningfulLines: true,
|
||||
}
|
||||
calc := NewCalculator(cfg)
|
||||
|
||||
metrics := &models.GlobalMetrics{
|
||||
Repositories: []models.RepositoryMetrics{
|
||||
{
|
||||
FullName: "owner/repo",
|
||||
Contributors: []models.ContributorMetrics{
|
||||
{
|
||||
Login: "commenter",
|
||||
CommitCount: 5,
|
||||
LinesAdded: 100, // All comment lines
|
||||
LinesDeleted: 50,
|
||||
MeaningfulLinesAdded: 0, // No meaningful code
|
||||
MeaningfulLinesDeleted: 0,
|
||||
RepositoriesContributed: []string{"owner/repo"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
result := calc.Calculate(metrics)
|
||||
|
||||
contributor := result.Repositories[0].Contributors[0]
|
||||
// Line change points should be 0 since all lines were comments
|
||||
assert.Equal(t, 0, contributor.Score.Breakdown.LineChanges)
|
||||
// Total: Commits (5 * 10 = 50) + Lines (0) = 50
|
||||
assert.Equal(t, 50, contributor.Score.Total)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user