@@ -13,13 +13,14 @@ Linguist v#{Linguist::VERSION}
1313Detect language type and determine language breakdown for a given Git repository.
1414
1515Usage: github-linguist <path>
16- github-linguist <path> [--rev REV] [--tree-size] [--breakdown] [--json]
17- github-linguist [--rev REV] [--tree-size] [--breakdown] [--json]
16+ github-linguist <path> [--rev REV] [--tree-size] [--breakdown] [--strategies] [-- json]
17+ github-linguist [--rev REV] [--tree-size] [--breakdown] [--strategies] [-- json]
1818HELP
1919
2020def github_linguist ( args )
2121 breakdown = false
2222 json_output = false
23+ show_strategies = false
2324 tree_size = Linguist ::Repository ::MAX_TREE_SIZE
2425 rev = 'HEAD'
2526 path = Dir . pwd
@@ -29,6 +30,7 @@ def github_linguist(args)
2930 opts . version = Linguist ::VERSION
3031
3132 opts . on ( "-b" , "--breakdown" , "Analyze entire repository and display detailed usage statistics" ) { breakdown = true }
33+ opts . on ( "-s" , "--strategies" , "Show language detection strategy used for each file" ) { show_strategies = true }
3234 opts . on ( "-j" , "--json" , "Output results as JSON" ) { json_output = true }
3335 opts . on ( "-r" , "--rev REV" , String ,
3436 "Analyze specific git revision" ,
@@ -59,6 +61,11 @@ def github_linguist(args)
5961 puts "invalid revision '#{ rev } ' for repo '#{ path } '"
6062 exit 1
6163 end
64+
65+ # Set up instrumentation to track detection strategies if requested
66+ instrumenter = show_strategies ? Linguist ::BasicInstrumenter . new : nil
67+ Linguist . instrumenter = instrumenter
68+
6269 repo = Linguist ::Repository . new ( rugged , target_oid , tree_size )
6370
6471 full_results = { }
@@ -72,13 +79,18 @@ def github_linguist(args)
7279 full_results . sort_by { |_ , v | v [ :size ] } . reverse . each do |language , details |
7380 puts "%-7s %-10s %s" % [ "#{ details [ :percentage ] } %" , details [ :size ] , language ]
7481 end
75- if breakdown
82+ if breakdown || show_strategies
7683 puts
7784 file_breakdown = repo . breakdown_by_file
7885 file_breakdown . each do |lang , files |
7986 puts "#{ lang } :"
8087 files . each do |file |
81- puts file
88+ strategy_info = instrumenter &.detected_info &.[]( file )
89+ if show_strategies && strategy_info
90+ puts " #{ file } [#{ strategy_info [ :strategy ] } ]"
91+ else
92+ puts " #{ file } "
93+ end
8294 end
8395 puts
8496 end
@@ -96,6 +108,9 @@ def github_linguist(args)
96108 end
97109 end
98110 elsif File . file? ( path )
111+ # Set up instrumentation to track detection strategies if requested
112+ instrumenter = show_strategies ? Linguist ::BasicInstrumenter . new : nil
113+ Linguist . instrumenter = instrumenter
99114
100115 begin
101116 # Check if this file is inside a git repository so we have things like
@@ -134,6 +149,10 @@ def github_linguist(args)
134149 puts " type: #{ type } "
135150 puts " mime type: #{ blob . mime_type } "
136151 puts " language: #{ blob . language } "
152+ if show_strategies && blob . language
153+ strategy_info = instrumenter . detected_info [ blob . name ]
154+ puts " strategy: #{ strategy_info [ :strategy ] } " if strategy_info
155+ end
137156
138157 if blob . large?
139158 puts " blob is too large to be shown"
0 commit comments