Revise edit and write restrictions
This commit is contained in:
parent
fa1821d6a6
commit
e650923bc7
@ -298,35 +298,52 @@ class Command_prompt(Label):
|
||||
self.message="error: could not write to file: too many arguments -- usage: ':w [path to file]'"
|
||||
return
|
||||
elif len(self.argv)==1:
|
||||
if os.path.isfile(self.app.openfile):
|
||||
if self.app.openfile!="":
|
||||
if self.app.readonly:
|
||||
self.message="error: open file is readonly"
|
||||
return
|
||||
self.app.painter.write(self.app.openfile)
|
||||
return
|
||||
else:
|
||||
self.message="error: no file is open for editing, specify a path"
|
||||
return
|
||||
else:
|
||||
|
||||
# check that the file is not a directory
|
||||
if os.path.isdir(self.argv[1]):
|
||||
self.message="error: '"+self.argv[1]+"' is a directory"
|
||||
return
|
||||
# check that file does not already exist
|
||||
elif self.argv[0]!="w!" and self.argv[1]!= self.app.openfile and os.path.isfile(self.argv[1]):
|
||||
if self.argv[0]!="w!" and self.argv[1]!= self.app.openfile and os.path.isfile(self.argv[1]):
|
||||
self.message="error: '"+self.argv[1]+"' already exists (use ':w!' to overwrite)"
|
||||
return
|
||||
# check that the containing directory exists
|
||||
elif len(os.path.dirname(self.argv[1]))>0 and not os.path.isdir(os.path.dirname(self.argv[1])):
|
||||
if len(os.path.dirname(self.argv[1]))>0 and not os.path.isdir(os.path.dirname(self.argv[1])):
|
||||
self.message="error: could not find directory '"+os.path.dirname(self.argv[1])+"'"
|
||||
return
|
||||
# check permissions
|
||||
elif (len(os.path.dirname(self.argv[1]))>0 and not os.access(os.path.dirname(self.argv[1]),os.W_OK)) or (len(os.path.dirname(self.argv[1]))==0 and not os.access(os.getcwd(),os.W_OK)):
|
||||
self.message="error: permission denied"
|
||||
if os.path.isfile(self.argv[1]):
|
||||
if not os.access(self.argv[1],os.W_OK):
|
||||
self.message="error: permission denied: cannot write to file '"+self.argv[1]+"'"
|
||||
return
|
||||
else:
|
||||
# check write to directory
|
||||
if len(os.path.dirname(self.argv[1]))>0:
|
||||
if not os.access(os.path.dirname(self.argv[1]),os.W_OK):
|
||||
self.message="error: permission denied: cannot write to parent directory '"+os.path.dirname(self.argv[1])+"'"
|
||||
return
|
||||
else:
|
||||
if not os.access(os.getcwd(),os.W_OK):
|
||||
self.message="error: permission denied: cannot write to parent directory '"+os.getcwd()+"'"
|
||||
return
|
||||
|
||||
# if we haven't returned yet
|
||||
self.app.openfile=self.argv[1]
|
||||
self.app.readonly=False
|
||||
self.app.painter.write(self.argv[1])
|
||||
# update status bar
|
||||
self.app.status_bar.draw()
|
||||
|
||||
# open file
|
||||
# edit file
|
||||
if self.argv[0]=="e":
|
||||
if len(self.argv)>2:
|
||||
self.message="error: could not open file: too many arguments -- usage: ':e <path to file>'"
|
||||
@ -334,24 +351,38 @@ class Command_prompt(Label):
|
||||
elif len(self.argv)==1:
|
||||
self.message="error: could not open file: no argument found -- usage: ':e <path to file>'"
|
||||
return
|
||||
else:
|
||||
|
||||
# check that the file is not a directory
|
||||
if os.path.isdir(self.argv[1]):
|
||||
self.message="error: '"+self.argv[1]+"' is a directory"
|
||||
return
|
||||
# check that the file exists
|
||||
elif not os.path.isfile(self.argv[1]):
|
||||
self.message="error: could not find file '"+self.argv[1]+"'"
|
||||
return
|
||||
if os.path.isfile(self.argv[1]):
|
||||
# check permissions
|
||||
elif not os.access(self.argv[1],os.R_OK):
|
||||
self.message="error: permission denied"
|
||||
if not os.access(self.argv[1],os.R_OK):
|
||||
self.message="error: permission denied: cannot read file '"+self.argv[1]+"'"
|
||||
return
|
||||
else:
|
||||
# select openfile
|
||||
self.app.openfile=self.argv[1]
|
||||
# read the file
|
||||
self.app.painter.read(self.argv[1])
|
||||
# set readonly mode
|
||||
self.app.readonly=not os.access(self.argv[1],os.W_OK)
|
||||
|
||||
else:
|
||||
# check write to directory
|
||||
if len(os.path.dirname(self.argv[1]))>0:
|
||||
if not os.access(os.path.dirname(self.argv[1]),os.W_OK):
|
||||
self.message="error: permission denied: cannot write to parent directory '"+os.path.dirname(self.argv[1])+"'"
|
||||
return
|
||||
else:
|
||||
if not os.access(os.getcwd(),os.W_OK):
|
||||
self.message="error: permission denied: cannot write to parent directory '"+os.getcwd()+"'"
|
||||
return
|
||||
# new file, reset painter
|
||||
self.app.painter.reset()
|
||||
self.app.readonly=False
|
||||
|
||||
# if we haven't returned yet
|
||||
# select openfile
|
||||
self.app.openfile=self.argv[1]
|
||||
# update status bar
|
||||
self.app.status_bar.draw()
|
||||
|
||||
|
21
cross.py
21
cross.py
@ -223,6 +223,13 @@ class Cross_painter(Widget):
|
||||
super(Cross_painter,self).__init__(**kwargs)
|
||||
|
||||
|
||||
def reset(self):
|
||||
self.crosses=[]
|
||||
self.selected=None
|
||||
self.canvas.clear()
|
||||
self.draw()
|
||||
|
||||
|
||||
# draw all crosses
|
||||
def draw(self):
|
||||
with self.canvas:
|
||||
@ -317,13 +324,23 @@ class Cross_painter(Widget):
|
||||
|
||||
# read configuration from file
|
||||
def read(self,file):
|
||||
self.crosses=[]
|
||||
self.reset()
|
||||
try:
|
||||
ff=open(file,"r")
|
||||
except:
|
||||
self.app.command_prompt.message="error: could not read file '"+file+"' (this should not happen and is probably a bug)"
|
||||
return
|
||||
|
||||
# counter
|
||||
i=0
|
||||
|
||||
for line in ff.readlines():
|
||||
try:
|
||||
lines=ff.readlines()
|
||||
except:
|
||||
self.app.command_prompt.message="error: could not read the contents of file '"+file+"'"
|
||||
return
|
||||
|
||||
for line in lines:
|
||||
i+=1
|
||||
|
||||
# remove newline
|
||||
|
5
jam
5
jam
@ -19,6 +19,9 @@ class Jam_app(App):
|
||||
# the file open for editing
|
||||
self.openfile=kwargs.get("openfile","")
|
||||
|
||||
# readonly mode
|
||||
self.readonly=False
|
||||
|
||||
super(Jam_app,self).__init__()
|
||||
|
||||
|
||||
@ -35,8 +38,8 @@ class Jam_app(App):
|
||||
layout.add_widget(self.painter)
|
||||
layout.add_widget(self.status_bar)
|
||||
layout.add_widget(self.command_prompt)
|
||||
return layout
|
||||
|
||||
return layout
|
||||
|
||||
|
||||
# disable red circles on right click
|
||||
|
@ -29,9 +29,16 @@ class Status_bar(Label):
|
||||
self.message=""
|
||||
return
|
||||
|
||||
# list openfile
|
||||
if self.app.openfile!="":
|
||||
self.raw_text=self.app.openfile
|
||||
else:
|
||||
self.raw_text="[no file]"
|
||||
|
||||
# readonly
|
||||
if self.app.readonly:
|
||||
self.raw_text+=" [RO]"
|
||||
|
||||
|
||||
# do not wrap
|
||||
self.text=self.raw_text[:min(len(self.raw_text),int(self.width/self.char_width))]
|
||||
|
Loading…
Reference in New Issue
Block a user