44 * See License.AGPL.txt in the project root for license information.
55 */
66
7+ import * as crypto from "crypto" ;
78import { inject , injectable } from "inversify" ;
8- import fetch from "node-fetch" ;
99import * as path from "path" ;
10- import * as crypto from "crypto" ;
1110
12- import { log , LogContext } from "@gitpod/gitpod-protocol/lib/util/logging" ;
1311import {
14- User ,
15- WorkspaceConfig ,
12+ AdditionalContentContext ,
13+ Commit ,
1614 CommitContext ,
17- Repository ,
18- ImageConfigString ,
1915 ExternalImageConfigFile ,
2016 ImageConfigFile ,
21- Commit ,
17+ ImageConfigString ,
2218 NamedWorkspaceFeatureFlag ,
23- AdditionalContentContext ,
24- WithDefaultConfig ,
2519 ProjectConfig ,
20+ Repository ,
21+ User ,
22+ WithDefaultConfig ,
23+ WorkspaceConfig ,
2624} from "@gitpod/gitpod-protocol" ;
2725import { GitpodFileParser } from "@gitpod/gitpod-protocol/lib/gitpod-file-parser" ;
26+ import { log , LogContext } from "@gitpod/gitpod-protocol/lib/util/logging" ;
2827
29- import { MaybeContent } from "../repohost/file-provider" ;
30- import { ConfigurationService } from "../config/configuration-service" ;
31- import { HostContextProvider } from "../auth/host-context-provider" ;
32- import { AuthorizationService } from "../user/authorization-service" ;
3328import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing" ;
29+ import { HostContextProvider } from "../auth/host-context-provider" ;
3430import { Config } from "../config" ;
35- import { EntitlementService } from "../billing/entitlement-service" ;
36- import { TeamDB } from "@gitpod/gitpod-db/lib" ;
31+ import { ConfigurationService } from "../config/configuration-service" ;
3732
3833const POD_PATH_WORKSPACE_BASE = "/workspace" ;
3934
4035@injectable ( )
4136export class ConfigProvider {
42- static readonly DEFINITELY_GP_REPO : Repository = {
43- host : "github.com" ,
44- owner : "gitpod-io" ,
45- name : "definitely-gp" ,
46- cloneUrl : "https://github.com/gitpod-io/definitely-gp" ,
47- } ;
48-
49- @inject ( GitpodFileParser ) protected readonly gitpodParser : GitpodFileParser ;
50- @inject ( HostContextProvider ) protected readonly hostContextProvider : HostContextProvider ;
51- @inject ( AuthorizationService ) protected readonly authService : AuthorizationService ;
52- @inject ( Config ) protected readonly config : Config ;
53- @inject ( ConfigurationService ) protected readonly configurationService : ConfigurationService ;
54- @inject ( EntitlementService ) protected readonly entitlementService : EntitlementService ;
55- @inject ( TeamDB ) protected readonly teamDB : TeamDB ;
37+ constructor (
38+ @inject ( GitpodFileParser ) private readonly gitpodParser : GitpodFileParser ,
39+ @inject ( HostContextProvider ) private readonly hostContextProvider : HostContextProvider ,
40+ @inject ( Config ) private readonly config : Config ,
41+ @inject ( ConfigurationService ) private readonly configurationService : ConfigurationService ,
42+ ) { }
5643
5744 public async fetchConfig (
5845 ctx : TraceContext ,
@@ -96,15 +83,10 @@ export class ConfigProvider {
9683 config . image = this . config . workspaceDefaults . workspaceImage ;
9784 } else if ( ImageConfigFile . is ( config . image ) ) {
9885 const dockerfilePath = [ configBasePath , config . image . file ] . filter ( ( s ) => ! ! s ) . join ( "/" ) ;
99- let repo = commit . repository ;
100- let rev = commit . revision ;
86+ const repo = commit . repository ;
87+ const rev = commit . revision ;
10188 const image = config . image ! ;
10289
103- if ( config . _origin === "definitely-gp" ) {
104- repo = ConfigProvider . DEFINITELY_GP_REPO ;
105- rev = "master" ;
106- image . file = dockerfilePath ;
107- }
10890 if ( ! ( AdditionalContentContext . is ( commit ) && commit . additionalFiles [ dockerfilePath ] ) ) {
10991 config . image = < ExternalImageConfigFile > {
11092 ...image ,
@@ -143,7 +125,7 @@ export class ConfigProvider {
143125 }
144126 }
145127
146- protected async fetchCustomConfig (
128+ private async fetchCustomConfig (
147129 ctx : TraceContext ,
148130 user : User ,
149131 commit : CommitContext ,
@@ -154,7 +136,7 @@ export class ConfigProvider {
154136
155137 try {
156138 let customConfig : WorkspaceConfig | undefined ;
157- let configBasePath = "" ;
139+ const configBasePath = "" ;
158140 if ( AdditionalContentContext . is ( commit ) && commit . additionalFiles [ ".gitpod.yml" ] ) {
159141 customConfigString = commit . additionalFiles [ ".gitpod.yml" ] ;
160142 const parseResult = this . gitpodParser . parse ( customConfigString ) ;
@@ -183,21 +165,6 @@ export class ConfigProvider {
183165 customConfigString = await contextRepoConfig ;
184166 let origin : WorkspaceConfig [ "_origin" ] = "repo" ;
185167
186- if ( ! customConfigString ) {
187- /* We haven't found a Gitpod configuration file in the context repo - check definitely-gp.
188- *
189- * In case we had found a config file here, we'd still be checking the definitely GP repo, just to save some time.
190- * While all those checks will be in vain, they should not leak memory either as they'll simply
191- * be resolved and garbage collected.
192- */
193- const definitelyGpConfig = this . fetchExternalGitpodFileContent ( { span } , commit . repository ) ;
194- const { content, basePath } = await definitelyGpConfig ;
195- customConfigString = content ;
196- // We do not only care about the config itself but also where we got it from
197- configBasePath = basePath ;
198- origin = "definitely-gp" ;
199- }
200-
201168 if ( ! customConfigString ) {
202169 const inferredConfig = this . configurationService . guessRepositoryConfiguration (
203170 { span } ,
@@ -248,7 +215,7 @@ export class ConfigProvider {
248215 } ;
249216 }
250217
251- protected async fetchWorkspaceImageSourceDocker (
218+ private async fetchWorkspaceImageSourceDocker (
252219 ctx : TraceContext ,
253220 repository : Repository ,
254221 revisionOrTagOrBranch : string ,
@@ -287,101 +254,7 @@ export class ConfigProvider {
287254 }
288255 }
289256
290- protected async fillInDefaultLocations (
291- cfg : WorkspaceConfig | undefined ,
292- inferredConfig : Promise < WorkspaceConfig | undefined > ,
293- ) : Promise < void > {
294- if ( ! cfg ) {
295- // there is no config - return
296- return ;
297- }
298-
299- if ( ! cfg . checkoutLocation ) {
300- const inferredCfg = await inferredConfig ;
301- if ( inferredCfg ) {
302- cfg . checkoutLocation = inferredCfg . checkoutLocation ;
303- }
304- }
305- if ( ! cfg . workspaceLocation ) {
306- const inferredCfg = await inferredConfig ;
307- if ( inferredCfg ) {
308- cfg . workspaceLocation = inferredCfg . workspaceLocation ;
309- }
310- }
311- }
312-
313- protected async fetchExternalGitpodFileContent (
314- ctx : TraceContext ,
315- repository : Repository ,
316- ) : Promise < { content : MaybeContent ; basePath : string } > {
317- const span = TraceContext . startSpan ( "fetchExternalGitpodFileContent" , ctx ) ;
318- span . setTag ( "repo" , `${ repository . owner } /${ repository . name } ` ) ;
319-
320- if ( this . config . definitelyGpDisabled ) {
321- span . finish ( ) ;
322- return {
323- content : undefined ,
324- basePath : `${ repository . name } ` ,
325- } ;
326- }
327-
328- try {
329- const ownerConfigBasePath = `${ repository . name } /${ repository . owner } ` ;
330- const baseConfigBasePath = `${ repository . name } ` ;
331-
332- const possibleConfigs = [
333- [ this . fetchDefinitelyGpContent ( { span } , `${ ownerConfigBasePath } /.gitpod.yml` ) , ownerConfigBasePath ] ,
334- [ this . fetchDefinitelyGpContent ( { span } , `${ ownerConfigBasePath } /.gitpod` ) , ownerConfigBasePath ] ,
335- [ this . fetchDefinitelyGpContent ( { span } , `${ baseConfigBasePath } /.gitpod.yml` ) , baseConfigBasePath ] ,
336- [ this . fetchDefinitelyGpContent ( { span } , `${ baseConfigBasePath } /.gitpod` ) , baseConfigBasePath ] ,
337- ] ;
338- for ( const [ configPromise , basePath ] of possibleConfigs ) {
339- const ownerConfig = await configPromise ;
340- if ( ownerConfig !== undefined ) {
341- return {
342- content : ownerConfig ,
343- basePath : basePath as string ,
344- } ;
345- }
346- }
347- return {
348- content : undefined ,
349- basePath : baseConfigBasePath ,
350- } ;
351- } catch ( e ) {
352- TraceContext . setError ( { span } , e ) ;
353- throw e ;
354- } finally {
355- span . finish ( ) ;
356- }
357- }
358-
359- protected async fetchDefinitelyGpContent ( ctx : TraceContext , filePath : string ) {
360- const span = TraceContext . startSpan ( "fetchDefinitelyGpContent" , ctx ) ;
361- span . setTag ( "filePath" , filePath ) ;
362-
363- try {
364- const url = `https://raw.githubusercontent.com/gitpod-io/definitely-gp/master/${ filePath } ` ;
365- const response = await fetch ( url , {
366- timeout : 10000 ,
367- method : "GET" ,
368- } ) ;
369- let content ;
370- if ( response . ok ) {
371- try {
372- content = await response . text ( ) ;
373- } catch { }
374- }
375- return content ;
376- } catch ( e ) {
377- TraceContext . setError ( { span } , e ) ;
378- throw e ;
379- } finally {
380- span . finish ( ) ;
381- }
382- }
383-
384- protected async validateConfig ( config : WorkspaceConfig , user : User ) : Promise < void > {
257+ private async validateConfig ( config : WorkspaceConfig , user : User ) : Promise < void > {
385258 // Make sure the projectRoot does not leave POD_PATH_WORKSPACE_BASE as that's a common
386259 // assumption throughout the code (e.g. ws-daemon)
387260 const checkoutLocation = config . checkoutLocation ;
@@ -407,7 +280,7 @@ export class ConfigProvider {
407280 }
408281 }
409282
410- protected leavesWorkspaceBase ( normalizedPath : string ) {
283+ private leavesWorkspaceBase ( normalizedPath : string ) {
411284 const pathSegments = normalizedPath . split ( path . sep ) ;
412285 return normalizedPath . includes ( ".." ) || pathSegments . slice ( 0 , 2 ) . join ( "/" ) != POD_PATH_WORKSPACE_BASE ;
413286 }
0 commit comments