Skip to content

Commit

Permalink
Fix #4056: Ungraceful UX when add-grammar fails
Browse files Browse the repository at this point in the history
  • Loading branch information
Alhadis committed Apr 13, 2018
1 parent e7f72cd commit 741bb6a
Showing 1 changed file with 65 additions and 33 deletions.
98 changes: 65 additions & 33 deletions script/add-grammar
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,18 @@ def command(*args)
output.each_line do |line|
log " > #{line}"
end
warn "Command failed. Aborting."
exit 1
raise "Command failed. Aborting."
end
end

usage = """Usage:
usage = <<~EOH
Usage:
#{$0} [-v|--verbose] [--replace grammar] url
Examples:
#{$0} https://github.com/Alhadis/language-roff
#{$0} --replace sublime-apl https://github.com/Alhadis/language-apl
"""
EOH

$replace = nil
$verbose = true
Expand All @@ -85,40 +86,71 @@ $url = ARGV[0]
# No URL? Print a usage message and bail.
unless $url
warn usage
exit 1;
exit 1
end

# Exit early if docker isn't installed or running.
log "Checking docker is installed and running"
command('docker', 'ps')
# Flags to track which changes should be reverted on an error
did_remove? = false
did_add? = false
gitmodules = File.read("#{ROOT}/.gitmodules")
git_config = File.read("#{ROOT}/.git/config")

# Ensure the given URL is an HTTPS link
parts = parse_url $url
https = "https://#{parts[:host]}/#{parts[:user]}/#{parts[:repo]}"
repo_new = "vendor/grammars/#{parts[:repo]}"
repo_old = parse_submodule($replace) if $replace
def restore_configs
File.write("#{ROOT}/.gitmodules", gitmodules)
File.write("#{ROOT}/.git/config", git_config)
end

Dir.chdir(ROOT)
begin
# Exit early if Docker isn't installed or running.
log "Checking Docker is installed and running"
command('docker', 'ps')

# Ensure the given URL is an HTTPS link
parts = parse_url $url
https = "https://#{parts[:host]}/#{parts[:user]}/#{parts[:repo]}"
repo_new = "vendor/grammars/#{parts[:repo]}"
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

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
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 "Registering new submodule: #{repo_new}"
command('git', 'submodule', 'add', '-f', https, repo_new)
command('script/grammar-compiler', 'add', repo_new) if $compile
log "Confirming license"
if repo_old
command('script/licensed')
else
command('script/licensed', '--module', repo_new)
end

log "Confirming license"
if repo_old
command('script/licensed')
else
command('script/licensed', '--module', repo_new)
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

log "Updating grammar documentation in vendor/README.md"
command('bundle', 'exec', 'rake', 'samples')
command('script/sort-submodules')
command('script/list-grammars')

0 comments on commit 741bb6a

Please sign in to comment.