@@ -48,6 +48,109 @@ const getRepos = async () => {
4848 }
4949 }
5050
51+ const getLanguages = async ( repo ) => {
52+ try {
53+ const { data } = await octokit . request ( 'GET /repos/{owner}/{repo}/languages' , {
54+ owner : repo . full_name . split ( '/' ) [ 0 ] ,
55+ repo : repo . name ,
56+ } )
57+ const languages = Object . keys ( data ) ;
58+ return languages
59+ } catch ( ex ) {
60+ throw ex
61+ }
62+ }
63+
64+ const getTeams = async ( repo ) => {
65+ try {
66+ const { data } = await octokit . request ( 'GET /repos/{owner}/{repo}/teams' , {
67+ owner : repo . full_name . split ( '/' ) [ 0 ] ,
68+ repo : repo . name ,
69+ } )
70+ const teams = data . map ( ( t ) => t . name ) ;
71+ return teams
72+ } catch ( ex ) {
73+ throw ex
74+ }
75+ }
76+
77+ const getTree = async ( repo ) => {
78+ try {
79+ const { data } = await octokit . request ( 'GET /repos/{owner}/{repo}/git/trees/{default_branch}?recursive=1' , {
80+ owner : repo . full_name . split ( '/' ) [ 0 ] ,
81+ repo : repo . name ,
82+ default_branch : repo . default_branch
83+ } )
84+ return data
85+ } catch ( ex ) {
86+ throw ex
87+ }
88+ }
89+
90+
91+ const getFileContent = async ( url ) => {
92+ try {
93+ const { data } = await octokit . request ( 'GET {url}' , {
94+ url : url
95+ } )
96+ const base64content = Buffer . from ( data . content , 'base64' )
97+ const fileContent = base64content . toString ( 'utf8' )
98+ return fileContent
99+ } catch ( ex ) {
100+ throw ex
101+ }
102+ }
103+
104+ function getStringBetween ( str , start , end ) {
105+ const result = str . match ( new RegExp ( start + "(.*)" + end ) ) ;
106+
107+ if ( result === undefined || result === null )
108+ {
109+ return '' ;
110+ }
111+
112+ return result [ 1 ] ;
113+ }
114+
115+ const getDotNetVersions = async ( fileTree ) => {
116+ const csprojBlobUrls = fileTree . tree . filter ( ( n ) => n . path . endsWith ( '.csproj' ) ) . map ( ( n ) => n . url ) ;
117+
118+ const csprojContentsPromises = csprojBlobUrls . map ( ( u ) => getFileContent ( u ) ) ;
119+
120+ const csprojContents = await Promise . all ( csprojContentsPromises )
121+
122+ const targetFrameworks = csprojContents . map ( ( c ) => getStringBetween ( c , '<TargetFramework>' , '</TargetFramework>' ) ) ;
123+ const targetFrameworkVersions = csprojContents . map ( ( c ) => getStringBetween ( c , '<TargetFrameworkVersion>' , '</TargetFrameworkVersion>' ) ) ;
124+ targetFrameworks . push ( ...targetFrameworkVersions ) ;
125+ //unique values + not empty + prefix with C#
126+ const versions = targetFrameworks . filter ( ( x , i , a ) => a . indexOf ( x ) == i ) . filter ( ( v ) => v != '' ) . map ( ( v ) => 'C# ' + v ) ;
127+
128+ return versions ;
129+ }
130+
131+ const enrichTags = async ( serviceDefinition ) => {
132+ if ( serviceDefinition . metadata . tags === undefined || serviceDefinition . metadata . tags === null )
133+ {
134+ serviceDefinition . metadata . tags = [ ] ;
135+ }
136+
137+ const languages = await getLanguages ( serviceDefinition . _repo ) ;
138+ serviceDefinition . metadata . tags . push ( ...languages ) ;
139+
140+ const teams = await getTeams ( serviceDefinition . _repo ) ;
141+ serviceDefinition . metadata . tags . push ( ...teams ) ;
142+
143+ if ( languages . includes ( 'C#' ) )
144+ {
145+ const fileTree = await getTree ( serviceDefinition . _repo ) ;
146+
147+ const versions = await getDotNetVersions ( fileTree ) ;
148+ serviceDefinition . metadata . tags . push ( ...versions ) ;
149+ }
150+
151+ serviceDefinition . metadata . tags = serviceDefinition . metadata . tags . filter ( ( x , i , a ) => a . indexOf ( x ) == i ) ; //only unique values
152+ }
153+
51154 const parseServiceDefinition = async ( repo , path ) => {
52155 const repoData = [ ]
53156 try {
@@ -61,6 +164,9 @@ const getRepos = async () => {
61164 serviceDefinition . _catalog_file = data . html_url
62165 serviceDefinition . _repo = repo
63166 serviceDefinition . status = 'OK'
167+
168+ await enrichTags ( serviceDefinition ) ;
169+
64170 repoData . push ( serviceDefinition )
65171 }
66172 }
@@ -76,6 +182,7 @@ const getRepos = async () => {
76182 core . debug ( `✋ Unable to find ${ path } in ${ repo . name } , not processing as 'push_missing' is false` )
77183 }
78184 }
185+
79186 return repoData
80187 }
81188
0 commit comments