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
0 commit comments