Skip to content

Commit 97903b7

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

7 files changed

+990
-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 the number of files they contain
2+
3+
MATCH (git_file:File&Git&!Repository)
4+
WITH percentileDisc(git_file.createdAtEpoch, 0.5) AS medianCreatedAtEpoch
5+
,percentileDisc(git_file.lastModificationAtEpoch, 0.5) AS medianLastModificationAtEpoch
6+
//,min(git_file.createdAtEpoch) AS oldestCreatedAtEpoch
7+
//,min(git_file.lastModificationAtEpoch) AS oldestLastModificationAtEpoch
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 createdAtTimestamp
12+
,datetime.fromepochMillis(coalesce(git_file.lastModificationAtEpoch, medianLastModificationAtEpoch)) AS lastModificationAtTimestamp
13+
WHERE git_file.deletedAt IS NULL
14+
WITH *
15+
,git_file.relativePath AS gitFileName
16+
,reverse(split(reverse(git_file.relativePath),'/')[0]) AS gitFileNameWithoutPath
17+
WITH *
18+
,rtrim(split(gitFileName, gitFileNameWithoutPath)[0], '/') AS gitDirectoryPath
19+
WITH *
20+
,coalesce(nullif(split(gitDirectoryPath, '/')[-2],''), 'root') AS directoryParentName
21+
,coalesce(nullif(split(gitDirectoryPath, '/')[-1],''), 'root') AS directoryName
22+
,size(split(gitDirectoryPath, '/')) AS directoryPathLength
23+
OPTIONAL MATCH (git_repository:Git&Repository)-[:HAS_FILE]->(git_file)
24+
OPTIONAL MATCH (git_commit:Git&Commit)-[:CONTAINS_CHANGE]->(git_change:Git&Change)-[]->(git_file)
25+
WITH *, COUNT { (git_commit)-[:HAS_PARENT]-(:Commit) } AS parentCommitCount
26+
// WHERE parentCommitCount < 2
27+
ORDER BY git_commit.date DESC
28+
WITH git_repository.name AS gitRepositoryName
29+
,gitDirectoryPath
30+
,directoryParentName
31+
,directoryName
32+
,directoryPathLength
33+
,count(DISTINCT gitFileName) AS fileCount
34+
,count(DISTINCT git_commit.sha) AS commitCount
35+
,count(DISTINCT git_commit.author) AS authorCount
36+
,date(max(git_commit.date)) AS latestCommitDate
37+
,max(date(createdAtTimestamp) ) AS latestCreationDate
38+
,max(date(lastModificationAtTimestamp)) AS latestModificationDate
39+
,duration.inDays(date(max(git_commit.date)), date()).days AS daysSinceLatestCommit
40+
,duration.inDays(max(createdAtTimestamp), datetime()).days AS daysSinceLatestCreation
41+
,duration.inDays(max(lastModificationAtTimestamp), datetime()).days AS daysSinceLatestModification
42+
// Debugging
43+
// ,collect(DISTINCT git_commit.sha)[0..9] AS gitCommitExamples
44+
// ,collect(DISTINCT git_commit.author)[0..9] AS gitCommitAuthorExamples
45+
// ,collect(git_file)[0..4] AS gitFileExamples
46+
// ,collect(gitFileName) AS gitFileNameExamples
47+
// ,collect(gitFileNameWithoutPath) AS gitFileNameWithoutPathExamples
48+
WHERE fileCount > 1 // Filter out single files and directories with only one file
49+
RETURN gitRepositoryName
50+
,gitDirectoryPath
51+
,directoryParentName
52+
,directoryName
53+
,directoryPathLength
54+
,fileCount
55+
,commitCount
56+
,authorCount
57+
,latestCommitDate
58+
,latestCreationDate
59+
,latestModificationDate
60+
,daysSinceLatestCommit
61+
,daysSinceLatestCreation
62+
,daysSinceLatestModification
63+
// Debugging
64+
// ,gitFileExamples
65+
// ,gitFileNameExamples
66+
// ,gitFileNameWithoutPathExamples
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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 gitDirectoryPath
34+
,parent AS directoryParentPath
35+
,split(parent, '/')[-1] AS directoryParentPathName
36+
,parent AS directoryParentName // TODO was directoryParentPathName
37+
,split(directory, '/')[-1] AS directoryPathName
38+
,directory AS directoryName // TODO was directoryPathName
39+
,size(split(directory, '/')) AS directoryPathLength
40+
,count(DISTINCT fileRelativePath) AS fileCount
41+
,max(date(fileCreatedAtTimestamp) ) AS latestCreationDate
42+
,max(date(fileLastModificationAtTimestamp)) AS latestModificationDate
43+
,sum(commitCount) AS commitCount
44+
,sum(authorCount) AS authorCount
45+
,max(lastCommitDate) AS latestCommitDate
46+
,duration.inDays(max(lastCommitDate), date()).days AS daysSinceLatestCommit
47+
,duration.inDays(max(fileCreatedAtTimestamp), datetime()).days AS daysSinceLatestCreation
48+
,duration.inDays(max(fileLastModificationAtTimestamp), datetime()).days AS daysSinceLatestModification
49+
// Debugging
50+
//,collect(DISTINCT fileRelativePath)[0..4] AS relativePathExamples
51+
//,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)