FIX: Gracefully handle force pushes for remote themes (#11325)
Force pushing a commit to a theme repository used to break the updater, because the system was not able to count the commits behind the old and new version. This operation failed because a force push deleted the old commits. The user was prompted with a simple "500 server error" message.
This commit is contained in:
parent
139c5dc356
commit
60bc38e6a8
|
@ -151,6 +151,15 @@ export default Controller.extend({
|
|||
|
||||
hasTranslations: notEmpty("translations"),
|
||||
|
||||
@discourseComputed(
|
||||
"model.remote_theme.local_version",
|
||||
"model.remote_theme.remote_version",
|
||||
"model.remote_theme.commits_behind"
|
||||
)
|
||||
hasOverwrittenHistory(localVersion, remoteVersion, commitsBehind) {
|
||||
return localVersion !== remoteVersion && commitsBehind === -1;
|
||||
},
|
||||
|
||||
@discourseComputed("model.remoteError", "updatingRemote")
|
||||
showRemoteError(errorMessage, updating) {
|
||||
return errorMessage && !updating;
|
||||
|
|
|
@ -105,7 +105,11 @@
|
|||
{{i18n "admin.customize.theme.updating"}}
|
||||
{{else}}
|
||||
{{#if model.remote_theme.commits_behind}}
|
||||
{{i18n "admin.customize.theme.commits_behind" count=model.remote_theme.commits_behind}}
|
||||
{{#if hasOverwrittenHistory}}
|
||||
{{i18n "admin.customize.theme.has_overwritten_history"}}
|
||||
{{else}}
|
||||
{{i18n "admin.customize.theme.commits_behind" count=model.remote_theme.commits_behind}}
|
||||
{{/if}}
|
||||
{{#if model.remote_theme.github_diff_link}}
|
||||
<a href={{model.remote_theme.github_diff_link}}>
|
||||
{{i18n "admin.customize.theme.compare_commits"}}
|
||||
|
|
|
@ -4073,6 +4073,7 @@ en:
|
|||
check_for_updates: "Check for Updates"
|
||||
updating: "Updating..."
|
||||
up_to_date: "Theme is up-to-date, last checked:"
|
||||
has_overwritten_history: "Current theme version no longer exists because the Git history has been overwritten by a force push."
|
||||
add: "Add"
|
||||
theme_settings: "Theme Settings"
|
||||
no_settings: "This theme has no settings."
|
||||
|
|
|
@ -35,7 +35,7 @@ class ThemeStore::GitImporter
|
|||
|
||||
Discourse::Utils.execute_command(chdir: @temp_folder) do |runner|
|
||||
commit_hash = runner.exec("git", "rev-parse", "HEAD").strip
|
||||
commits_behind = runner.exec("git", "rev-list", "#{hash}..HEAD", "--count").strip
|
||||
commits_behind = runner.exec("git", "rev-list", "#{hash}..HEAD", "--count").strip rescue -1
|
||||
end
|
||||
|
||||
[commit_hash, commits_behind]
|
||||
|
|
|
@ -158,6 +158,29 @@ describe RemoteTheme do
|
|||
scheme = ColorScheme.find_by(theme_id: @theme.id)
|
||||
expect(scheme.colors.find_by(name: 'tertiary_low_color')).to eq(nil)
|
||||
end
|
||||
|
||||
it "can update themes with overwritten history" do
|
||||
theme = RemoteTheme.import_theme(initial_repo)
|
||||
remote = theme.remote_theme
|
||||
|
||||
old_version = `cd #{initial_repo} && git rev-parse HEAD`.strip
|
||||
expect(theme.name).to eq('awesome theme')
|
||||
expect(remote.remote_url).to eq(initial_repo)
|
||||
expect(remote.local_version).to eq(old_version)
|
||||
expect(remote.remote_version).to eq(old_version)
|
||||
|
||||
`cd #{initial_repo} && git commit --amend -m "amended commit"`
|
||||
new_version = `cd #{initial_repo} && git rev-parse HEAD`.strip
|
||||
|
||||
# make sure that the amended commit does not exist anymore
|
||||
`cd #{initial_repo} && git reflog expire --all --expire=now`
|
||||
`cd #{initial_repo} && git prune`
|
||||
|
||||
remote.update_remote_version
|
||||
expect(remote.reload.local_version).to eq(old_version)
|
||||
expect(remote.reload.remote_version).to eq(new_version)
|
||||
expect(remote.reload.commits_behind).to eq(-1)
|
||||
end
|
||||
end
|
||||
|
||||
let(:github_repo) do
|
||||
|
|
Loading…
Reference in New Issue