Skip to content

Commit 1e962e5

Browse files
committed
Add git history file overview treemap
1 parent 4e667aa commit 1e962e5

7 files changed

+952
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// List git file directories and the number of files they contain
2+
3+
MATCH (git_file:File&Git&!Repository)
4+
WITH *
5+
,git_file.relativePath AS gitFileName
6+
,reverse(split(reverse(git_file.relativePath),'/')[0]) AS gitFileNameWithoutPath
7+
,(git_file:Directory) AS isDirectory
8+
WITH *
9+
,rtrim(split(gitFileName, gitFileNameWithoutPath)[0], '/') AS gitDirectoryPath
10+
WITH gitDirectoryPath
11+
,coalesce(nullif(split(gitDirectoryPath, '/')[-2],''), 'root') AS directoryParentName
12+
,coalesce(nullif(split(gitDirectoryPath, '/')[-1],''), 'root') AS directoryName
13+
,size(split(gitDirectoryPath, '/')) AS pathLength
14+
,count(DISTINCT gitFileName) AS fileCount
15+
// Debugging
16+
// ,collect(git_file)[0..4] AS gitFileExamples
17+
// ,collect(gitFileName) AS gitFileNameExamples
18+
// ,collect(gitFileNameWithoutPath) AS gitFileNameWithoutPathExamples
19+
WHERE fileCount > 1
20+
RETURN gitDirectoryPath
21+
,directoryParentName
22+
,directoryName
23+
,pathLength
24+
,fileCount
25+
// Debugging
26+
// ,gitFileExamples
27+
// ,gitFileNameExamples
28+
// ,gitFileNameWithoutPathExamples
29+
ORDER BY gitDirectoryPath ASC
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// List git file directories and their statistics
2+
3+
MATCH (git_file:File&Git&!Repository)
4+
WHERE git_file.deletedAt IS NULL // filter out deleted files
5+
ORDER BY git_file.relativePath
6+
WITH percentileDisc(git_file.createdAtEpoch, 0.5) AS medianCreatedAtEpoch
7+
,percentileDisc(git_file.lastModificationAtEpoch, 0.5) AS medianLastModificationAtEpoch
8+
,collect(git_file) AS git_files
9+
UNWIND git_files AS git_file
10+
WITH *
11+
,datetime.fromepochMillis(coalesce(git_file.createdAtEpoch, medianCreatedAtEpoch)) AS fileCreatedAtTimestamp
12+
,datetime.fromepochMillis(coalesce(git_file.lastModificationAtEpoch, medianLastModificationAtEpoch)) AS fileLastModificationAtTimestamp
13+
WITH *, split(git_file.relativePath, '/') AS pathElements
14+
WITH *, pathElements[-1] AS fileName
15+
MATCH (git_repository:Git&Repository)-[:HAS_FILE]->(git_file)
16+
MATCH (git_commit:Git&Commit)-[:CONTAINS_CHANGE]->(git_change:Git&Change)-[]->(git_file)
17+
WITH pathElements
18+
,fileCreatedAtTimestamp
19+
,fileLastModificationAtTimestamp
20+
,fileName
21+
,git_file.relativePath AS fileRelativePath
22+
,max(git_repository.name) AS repository
23+
,max(git_commit.sha) AS maxCommitSha
24+
,COUNT(DISTINCT git_commit.sha) AS commitCount
25+
,COUNT(DISTINCT git_commit.author) AS authorCount
26+
,date(max(git_commit.date)) AS lastCommitDate
27+
UNWIND pathElements AS pathElement
28+
WITH *
29+
,coalesce(nullif(split(fileRelativePath, '/' + pathElement)[0], fileRelativePath), '') AS parent
30+
WITH *
31+
,coalesce(nullif(parent,'') + '/', '') + pathElement AS directory
32+
WHERE pathElement <> fileName
33+
WITH repository AS gitRepositoryName
34+
,directory AS directoryPath
35+
,split(directory, '/')[-1] AS directoryName
36+
,parent AS directoryParentPath
37+
,split(parent, '/')[-1] AS directoryParentName
38+
,size(split(directory, '/')) AS directoryPathLength
39+
,count(DISTINCT fileRelativePath) AS fileCount
40+
,max(date(fileCreatedAtTimestamp) ) AS lastCreationDate
41+
,max(date(fileLastModificationAtTimestamp)) AS lastModificationDate
42+
,sum(commitCount) AS commitCount
43+
,sum(authorCount) AS authorCount
44+
,max(maxCommitSha) AS maxCommitSha
45+
,max(lastCommitDate) AS lastCommitDate
46+
,duration.inDays(max(lastCommitDate), date()).days AS daysSinceLastCommit
47+
,duration.inDays(max(fileCreatedAtTimestamp), datetime()).days AS daysSinceLastCreation
48+
,duration.inDays(max(fileLastModificationAtTimestamp), datetime()).days AS daysSinceLastModification
49+
// The final results are grouped by the statistic values like file count,...
50+
RETURN gitRepositoryName
51+
,fileCount
52+
,lastCreationDate
53+
,lastModificationDate
54+
,commitCount
55+
,authorCount
56+
,maxCommitSha
57+
,lastCommitDate
58+
,daysSinceLastCommit
59+
,daysSinceLastCreation
60+
,daysSinceLastModification
61+
,collect(directoryPath)[-1] AS directoryPath
62+
,apoc.text.join(collect(directoryName), '/') AS directoryName
63+
,collect(directoryParentPath)[0] AS directoryParentPath
64+
,collect(directoryParentName)[0] AS directoryParentName
65+
,max(directoryPathLength) AS directoryPathLength
66+
,count(DISTINCT directoryPath) AS combinedDirectoriesCount
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// List git file directories and their statistics
2+
3+
MATCH (git_file:File&Git&!Repository)
4+
WHERE git_file.deletedAt IS NULL // filter out deleted files
5+
ORDER BY git_file.relativePath
6+
WITH percentileDisc(git_file.createdAtEpoch, 0.5) AS medianCreatedAtEpoch
7+
,percentileDisc(git_file.lastModificationAtEpoch, 0.5) AS medianLastModificationAtEpoch
8+
,collect(git_file) AS git_files
9+
UNWIND git_files AS git_file
10+
WITH *
11+
,datetime.fromepochMillis(coalesce(git_file.createdAtEpoch, medianCreatedAtEpoch)) AS fileCreatedAtTimestamp
12+
,datetime.fromepochMillis(coalesce(git_file.lastModificationAtEpoch, medianLastModificationAtEpoch)) AS fileLastModificationAtTimestamp
13+
WITH *, split(git_file.relativePath, '/') AS pathElements
14+
WITH *, pathElements[-1] AS fileName
15+
MATCH (git_repository:Git&Repository)-[:HAS_FILE]->(git_file)
16+
MATCH (git_commit:Git&Commit)-[:CONTAINS_CHANGE]->(git_change:Git&Change)-[]->(git_file)
17+
WITH pathElements
18+
,fileCreatedAtTimestamp
19+
,fileLastModificationAtTimestamp
20+
,fileName
21+
,git_file.relativePath AS fileRelativePath
22+
,max(git_repository.name) AS repository
23+
,COUNT(DISTINCT git_commit.sha) AS commitCount
24+
,COUNT(DISTINCT git_commit.author) AS authorCount
25+
,date(max(git_commit.date)) AS lastCommitDate
26+
UNWIND pathElements AS pathElement
27+
WITH *
28+
,coalesce(nullif(split(fileRelativePath, '/' + pathElement)[0], fileRelativePath), '') AS parent
29+
WITH *
30+
,coalesce(nullif(parent,'') + '/', '') + pathElement AS directory
31+
WHERE pathElement <> fileName
32+
RETURN repository AS gitRepositoryName
33+
,directory AS directoryPath
34+
,split(directory, '/')[-1] AS directoryName
35+
,parent AS directoryParentPath
36+
,split(parent, '/')[-1] AS directoryParentName
37+
,size(split(directory, '/')) AS directoryPathLength
38+
,count(DISTINCT fileRelativePath) AS fileCount
39+
,max(date(fileCreatedAtTimestamp) ) AS lastCreationDate
40+
,max(date(fileLastModificationAtTimestamp)) AS lastModificationDate
41+
,sum(commitCount) AS commitCount
42+
,sum(authorCount) AS authorCount
43+
,max(lastCommitDate) AS lastCommitDate
44+
,duration.inDays(max(lastCommitDate), date()).days AS daysSinceLastCommit
45+
,duration.inDays(max(fileCreatedAtTimestamp), datetime()).days AS daysSinceLastCreation
46+
,duration.inDays(max(fileLastModificationAtTimestamp), datetime()).days AS daysSinceLastModification
47+
// Debugging
48+
//,collect(DISTINCT fileRelativePath)[0..4] AS relativePathExamples
49+
//,collect(DISTINCT fileName)[0..4] AS fileNameExamples
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Check if there is at least one Git:Commit pointing to a Git:Change containing a Git:File
2+
3+
MATCH (commit:Git:Commit)-[:CONTAINS_CHANGE]->(change:Git:Change)-->(file:Git:File)
4+
RETURN commit.sha AS commitSha
5+
LIMIT 1

0 commit comments

Comments
 (0)