mirror of
https://github.com/discourse/discourse.git
synced 2025-03-06 11:19:51 +00:00
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"),
|
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")
|
@discourseComputed("model.remoteError", "updatingRemote")
|
||||||
showRemoteError(errorMessage, updating) {
|
showRemoteError(errorMessage, updating) {
|
||||||
return errorMessage && !updating;
|
return errorMessage && !updating;
|
||||||
|
@ -105,7 +105,11 @@
|
|||||||
{{i18n "admin.customize.theme.updating"}}
|
{{i18n "admin.customize.theme.updating"}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if model.remote_theme.commits_behind}}
|
{{#if 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}}
|
{{i18n "admin.customize.theme.commits_behind" count=model.remote_theme.commits_behind}}
|
||||||
|
{{/if}}
|
||||||
{{#if model.remote_theme.github_diff_link}}
|
{{#if model.remote_theme.github_diff_link}}
|
||||||
<a href={{model.remote_theme.github_diff_link}}>
|
<a href={{model.remote_theme.github_diff_link}}>
|
||||||
{{i18n "admin.customize.theme.compare_commits"}}
|
{{i18n "admin.customize.theme.compare_commits"}}
|
||||||
|
@ -4073,6 +4073,7 @@ en:
|
|||||||
check_for_updates: "Check for Updates"
|
check_for_updates: "Check for Updates"
|
||||||
updating: "Updating..."
|
updating: "Updating..."
|
||||||
up_to_date: "Theme is up-to-date, last checked:"
|
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"
|
add: "Add"
|
||||||
theme_settings: "Theme Settings"
|
theme_settings: "Theme Settings"
|
||||||
no_settings: "This theme has no settings."
|
no_settings: "This theme has no settings."
|
||||||
|
@ -35,7 +35,7 @@ class ThemeStore::GitImporter
|
|||||||
|
|
||||||
Discourse::Utils.execute_command(chdir: @temp_folder) do |runner|
|
Discourse::Utils.execute_command(chdir: @temp_folder) do |runner|
|
||||||
commit_hash = runner.exec("git", "rev-parse", "HEAD").strip
|
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
|
end
|
||||||
|
|
||||||
[commit_hash, commits_behind]
|
[commit_hash, commits_behind]
|
||||||
|
@ -158,6 +158,29 @@ describe RemoteTheme do
|
|||||||
scheme = ColorScheme.find_by(theme_id: @theme.id)
|
scheme = ColorScheme.find_by(theme_id: @theme.id)
|
||||||
expect(scheme.colors.find_by(name: 'tertiary_low_color')).to eq(nil)
|
expect(scheme.colors.find_by(name: 'tertiary_low_color')).to eq(nil)
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
let(:github_repo) do
|
let(:github_repo) do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user