@@ -5,14 +5,23 @@ import { getGitHubUrl } from "./git/repository";
55import { LogScheme } from "./logs/constants" ;
66import { WorkflowStepLogProvider } from "./logs/fileProvider" ;
77import { WorkflowStepLogFoldingProvider } from "./logs/foldingProvider" ;
8- import { Secret , Workflow , WorkflowJob , WorkflowRun } from "./model" ;
8+ import {
9+ Secret ,
10+ Workflow ,
11+ WorkflowJob ,
12+ WorkflowRun ,
13+ WorkflowStep
14+ } from "./model" ;
915import { encodeSecret } from "./secrets" ;
1016import { initResources } from "./treeViews/icons" ;
1117import { SettingsTreeProvider } from "./treeViews/settings" ;
1218import { ActionsExplorerProvider as WorkflowsTreeProvider } from "./treeViews/workflows" ;
1319import { getWorkflowUri } from "./workflow/workflow" ;
1420import Octokit = require( "@octokit/rest" ) ;
1521import { buildLogURI } from "./logs/scheme" ;
22+ import { WorkflowStepLogSymbolProvider } from "./logs/symbolProvider" ;
23+ import { registerFormatProvider } from "./logs/formatProvider" ;
24+ import { parseLog } from "./logs/model" ;
1625
1726export function activate ( context : vscode . ExtensionContext ) {
1827 // TODO: Remove
@@ -118,14 +127,43 @@ export function activate(context: vscode.ExtensionContext) {
118127 ) ;
119128
120129 context . subscriptions . push (
121- vscode . commands . registerCommand ( "workflow.step. logs" , async args => {
130+ vscode . commands . registerCommand ( "workflow.logs" , async args => {
122131 const repo : Protocol = args . repo ;
123132 const job : WorkflowJob = args . job ;
124- const uri = buildLogURI ( repo . owner , repo . repositoryName , job . id ) ;
133+ const step : WorkflowStep | undefined = args . step ;
134+ const uri = buildLogURI (
135+ repo . owner ,
136+ repo . repositoryName ,
137+ job . id ,
138+ step ?. name
139+ ) ;
125140 const doc = await vscode . workspace . openTextDocument ( uri ) ;
126- await vscode . window . showTextDocument ( doc , {
127- preview : true
141+ const editor = await vscode . window . showTextDocument ( doc , {
142+ preview : false
128143 } ) ;
144+ if ( step ) {
145+ // This parses the log - again - as a future optimization this should be done only once.
146+ const logInfo = parseLog ( editor . document . getText ( ) ) ;
147+ let matchingSection = logInfo . sections . find (
148+ s => s . name && s . name === step . name
149+ ) ;
150+ if ( ! matchingSection ) {
151+ // If we cannot match by name, see if we can try to match by number
152+ matchingSection = logInfo . sections [ step . number - 1 ] ;
153+ }
154+
155+ if ( matchingSection ) {
156+ editor . revealRange (
157+ new vscode . Range (
158+ matchingSection . start ,
159+ 0 ,
160+ matchingSection . start ,
161+ 0
162+ ) ,
163+ vscode . TextEditorRevealType . InCenter
164+ ) ;
165+ }
166+ }
129167 } )
130168 ) ;
131169
@@ -266,6 +304,9 @@ export function activate(context: vscode.ExtensionContext) {
266304 } )
267305 ) ;
268306
307+ //
308+ // Log providers
309+ //
269310 context . subscriptions . push (
270311 vscode . workspace . registerTextDocumentContentProvider (
271312 LogScheme ,
@@ -279,6 +320,17 @@ export function activate(context: vscode.ExtensionContext) {
279320 new WorkflowStepLogFoldingProvider ( )
280321 )
281322 ) ;
323+
324+ context . subscriptions . push (
325+ vscode . languages . registerDocumentSymbolProvider (
326+ {
327+ scheme : LogScheme
328+ } ,
329+ new WorkflowStepLogSymbolProvider ( )
330+ )
331+ ) ;
332+
333+ registerFormatProvider ( context ) ;
282334}
283335
284336// this method is called when your extension is deactivated
0 commit comments