mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Fix #4056: Ungraceful UX when add-grammar fails
				
					
				
			This commit is contained in:
		| @@ -50,17 +50,18 @@ def command(*args) | |||||||
|     output.each_line do |line| |     output.each_line do |line| | ||||||
|       log "  > #{line}" |       log "  > #{line}" | ||||||
|     end |     end | ||||||
|     warn "Command failed. Aborting." |     raise "Command failed. Aborting." | ||||||
|     exit 1 |  | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| usage = """Usage: | usage = <<~EOH | ||||||
|  | Usage: | ||||||
|   #{$0} [-v|--verbose] [--replace grammar] url |   #{$0} [-v|--verbose] [--replace grammar] url | ||||||
|  |  | ||||||
| Examples: | Examples: | ||||||
|   #{$0} https://github.com/Alhadis/language-roff |   #{$0} https://github.com/Alhadis/language-roff | ||||||
|   #{$0} --replace sublime-apl https://github.com/Alhadis/language-apl |   #{$0} --replace sublime-apl https://github.com/Alhadis/language-apl | ||||||
| """ | EOH | ||||||
|  |  | ||||||
| $replace = nil | $replace = nil | ||||||
| $verbose = true | $verbose = true | ||||||
| @@ -85,40 +86,71 @@ $url = ARGV[0] | |||||||
| # No URL? Print a usage message and bail. | # No URL? Print a usage message and bail. | ||||||
| unless $url | unless $url | ||||||
|   warn usage |   warn usage | ||||||
|   exit 1; |   exit 1 | ||||||
| end | end | ||||||
|  |  | ||||||
| # Exit early if docker isn't installed or running. | # Flags to track which changes should be reverted on an error | ||||||
| log "Checking docker is installed and running" | did_remove? = false | ||||||
| command('docker', 'ps') | did_add?    = false | ||||||
|  | gitmodules  = File.read("#{ROOT}/.gitmodules") | ||||||
|  | git_config  = File.read("#{ROOT}/.git/config") | ||||||
|  |  | ||||||
| # Ensure the given URL is an HTTPS link | def restore_configs | ||||||
| parts    = parse_url $url |   File.write("#{ROOT}/.gitmodules", gitmodules) | ||||||
| https    = "https://#{parts[:host]}/#{parts[:user]}/#{parts[:repo]}" |   File.write("#{ROOT}/.git/config", git_config) | ||||||
| repo_new = "vendor/grammars/#{parts[:repo]}" |  | ||||||
| repo_old = parse_submodule($replace) if $replace |  | ||||||
|  |  | ||||||
| Dir.chdir(ROOT) |  | ||||||
|  |  | ||||||
| if repo_old |  | ||||||
|   log "Deregistering: #{repo_old}" |  | ||||||
|   command('git', 'submodule', 'deinit', repo_old) |  | ||||||
|   command('git', 'rm', '-rf', repo_old) |  | ||||||
|   command('script/grammar-compiler', 'update', '-f') if $compile |  | ||||||
| end | end | ||||||
|  |  | ||||||
| log "Registering new submodule: #{repo_new}" | begin | ||||||
| command('git', 'submodule', 'add', '-f', https, repo_new) |   # Exit early if Docker isn't installed or running. | ||||||
| command('script/grammar-compiler', 'add', repo_new) if $compile |   log "Checking Docker is installed and running" | ||||||
|  |   command('docker', 'ps') | ||||||
|  |  | ||||||
| log "Confirming license" |   # Ensure the given URL is an HTTPS link | ||||||
| if repo_old |   parts    = parse_url $url | ||||||
|   command('script/licensed') |   https    = "https://#{parts[:host]}/#{parts[:user]}/#{parts[:repo]}" | ||||||
| else |   repo_new = "vendor/grammars/#{parts[:repo]}" | ||||||
|   command('script/licensed', '--module', repo_new) |   repo_old = parse_submodule($replace) if $replace | ||||||
|  |  | ||||||
|  |   Dir.chdir(ROOT) | ||||||
|  |  | ||||||
|  |   if repo_old | ||||||
|  |     log "Deregistering: #{repo_old}" | ||||||
|  |     removed = repo_old | ||||||
|  |     command('git', 'submodule', 'deinit', repo_old) | ||||||
|  |     command('git', 'rm', '-rf', repo_old) | ||||||
|  |     command('script/grammar-compiler', 'update', '-f') | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   log "Registering new submodule: #{repo_new}" | ||||||
|  |   added = repo_new | ||||||
|  |   command('git', 'submodule', 'add', '-f', https, repo_new) | ||||||
|  |   command('script/grammar-compiler', 'add', repo_new) | ||||||
|  |  | ||||||
|  |   log "Confirming license" | ||||||
|  |   if repo_old | ||||||
|  |     command('script/licensed') | ||||||
|  |   else | ||||||
|  |     command('script/licensed', '--module', repo_new) | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   log "Updating grammar documentation in vendor/README.md" | ||||||
|  |   command('bundle', 'exec', 'rake', 'samples') | ||||||
|  |   command('script/sort-submodules') | ||||||
|  |   command('script/list-grammars') | ||||||
|  | rescue => ex | ||||||
|  |   if did_add? | ||||||
|  |     `git submodule deinit #{repo_new}` | ||||||
|  |     `rm -rf #{repo_new}` | ||||||
|  |     `rm -rf .git/modules/#{repo_new}/` | ||||||
|  |   end | ||||||
|  |   restore_configs() | ||||||
|  |   if did_remove? | ||||||
|  |     `rm -rf #{repo_old}` | ||||||
|  |     `git submodule add -f "#{https}", "#{repo_old}"` | ||||||
|  |      | ||||||
|  |     # Revert twice. Make no assumpsions about | ||||||
|  |     # badly-mangled the working tree is. | ||||||
|  |     restore_configs() | ||||||
|  |   end | ||||||
|  |   exit 1 | ||||||
| end | end | ||||||
|  |  | ||||||
| log "Updating grammar documentation in vendor/README.md" |  | ||||||
| command('bundle', 'exec', 'rake', 'samples') |  | ||||||
| command('script/sort-submodules') |  | ||||||
| command('script/list-grammars') |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user