Plugin manager: Atomic overwrites, remove otherstate plugin on rename
- Atomically overwrite existing plugins when adding a new one - When renaming over plugin, remove target in another state
This commit is contained in:
parent
64d498b74e
commit
34eaba54a2
1 changed files with 24 additions and 8 deletions
|
@ -203,15 +203,16 @@ void wxeditor_plugins::on_add(wxCommandEvent& e)
|
|||
}
|
||||
nname = pathpfx + "/" + name + "(" + (stringfmt() << counter++).str() + ")." + extension;
|
||||
}
|
||||
std::string nnamet = nname + ".tmp";
|
||||
std::ifstream in(file, std::ios::binary);
|
||||
std::ofstream out(nname, std::ios::binary);
|
||||
std::ofstream out(nnamet, std::ios::binary);
|
||||
if(!out) {
|
||||
show_message_ok(this, "Error", "Can't write file '" + nname + "'", wxICON_EXCLAMATION);
|
||||
show_message_ok(this, "Error", "Can't write file '" + nnamet + "'", wxICON_EXCLAMATION);
|
||||
reload_plugins();
|
||||
return;
|
||||
}
|
||||
if(!in) {
|
||||
remove(nname.c_str());
|
||||
remove(nnamet.c_str());
|
||||
show_message_ok(this, "Error", "Can't read file '" + file + "'", wxICON_EXCLAMATION);
|
||||
reload_plugins();
|
||||
return;
|
||||
|
@ -225,8 +226,8 @@ void wxeditor_plugins::on_add(wxCommandEvent& e)
|
|||
break;
|
||||
}
|
||||
if(!out) {
|
||||
remove(nname.c_str());
|
||||
show_message_ok(this, "Error", "Can't write file '" + nname + "'", wxICON_EXCLAMATION);
|
||||
remove(nnamet.c_str());
|
||||
show_message_ok(this, "Error", "Can't write file '" + nnamet + "'", wxICON_EXCLAMATION);
|
||||
reload_plugins();
|
||||
return;
|
||||
}
|
||||
|
@ -234,13 +235,20 @@ void wxeditor_plugins::on_add(wxCommandEvent& e)
|
|||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#else
|
||||
struct stat s;
|
||||
if(stat(nname.c_str(), &s) < 0)
|
||||
if(stat(file.c_str(), &s) < 0)
|
||||
s.st_mode = 0644;
|
||||
if(s.st_mode & 0400) s.st_mode |= 0100;
|
||||
if(s.st_mode & 040) s.st_mode |= 010;
|
||||
if(s.st_mode & 04) s.st_mode |= 01;
|
||||
chmod(nname.c_str(), s.st_mode & 0777);
|
||||
chmod(nnamet.c_str(), s.st_mode & 0777);
|
||||
#endif
|
||||
if(zip::rename_overwrite(nnamet.c_str(), nname.c_str())) {
|
||||
remove(nnamet.c_str());
|
||||
show_message_ok(this, "Error", "Can't rename-over file '" + nname + "'",
|
||||
wxICON_EXCLAMATION);
|
||||
reload_plugins();
|
||||
return;
|
||||
}
|
||||
//The new plugin isn't failed.
|
||||
failed_plugins.erase(get_name(nname));
|
||||
std::string disname = nname + ".disabled";
|
||||
|
@ -264,8 +272,16 @@ void wxeditor_plugins::on_rename(wxCommandEvent& e)
|
|||
}
|
||||
std::string oname = pathpfx + "/" + name + "." + extension + (pluginstbl[sel].second ? "" : ".disabled");
|
||||
std::string nname = pathpfx + "/" + name2 + "." + extension + (pluginstbl[sel].second ? "" : ".disabled");
|
||||
if(oname != nname)
|
||||
if(oname != nname) {
|
||||
zip::rename_overwrite(oname.c_str(), nname.c_str());
|
||||
if(pluginstbl[sel].second) {
|
||||
std::string dname = nname + ".disabled";
|
||||
remove(dname.c_str());
|
||||
} else {
|
||||
std::string ename = pathpfx + "/" + name2 + "." + extension;
|
||||
remove(ename.c_str());
|
||||
}
|
||||
}
|
||||
pluginstbl[sel].first = name2;
|
||||
if(failed_plugins.count(name + "." + extension)) {
|
||||
failed_plugins.insert(name2 + "." + extension);
|
||||
|
|
Loading…
Add table
Reference in a new issue