Skip to content

Commit

Permalink
efficiency + error handling for permanentlyDeleteFile
Browse files Browse the repository at this point in the history
  • Loading branch information
quackduck committed Jul 15, 2022
1 parent 7afd3f4 commit 7ad0602
Showing 1 changed file with 51 additions and 19 deletions.
70 changes: 51 additions & 19 deletions rem.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,13 @@ func main() {
color.Red("Warning, permanently deleting: ")
printFormattedList(os.Args[i+1:])
if promptBool("Confirm delete?") {
var err error
for _, filePath := range os.Args[i+1:] {
permanentlyDeleteFile(filePath)
err = permanentlyDeleteFile(filePath)
if err != nil {
fmt.Println("Could not delete " + filePath)
handleErr(err)
}
}
}
return
Expand Down Expand Up @@ -197,7 +202,10 @@ func renameByCopyAllowed(src, dst string) error {
err := os.Rename(src, dst)
if err != nil {
err = copy.Copy(src, dst)
permanentlyDeleteFile(src)
if err != nil {
return err
}
err = permanentlyDeleteFile(src)
}
return err
}
Expand Down Expand Up @@ -247,8 +255,14 @@ func listFilesInTrash() []string {
}

func emptyTrash() {
permanentlyDeleteFile(dataDir + "/trash")
permanentlyDeleteFile(dataDir + "/" + logFileName)
err := permanentlyDeleteFile(dataDir + "/trash")
if err != nil {
handleErrStr("Couldn't delete " + dataDir + "/trash " + err.Error())
}
err = permanentlyDeleteFile(dataDir + "/" + logFileName)
if err != nil {
handleErrStr("Couldn't delete " + dataDir + "/" + logFileName + " " + err.Error())
}
}

func getLogFile() map[string]string {
Expand Down Expand Up @@ -306,8 +320,12 @@ func ensureTrashDir() {
return
}
if !i.IsDir() {
permanentlyDeleteFile(dataDir + "/trash") // not a dir so delete
ensureTrashDir() // then make it
err := permanentlyDeleteFile(dataDir + "/trash") // not a dir so delete
if err != nil {
handleErr(err)
return
}
ensureTrashDir() // then make it
}
}

Expand All @@ -326,23 +344,37 @@ func chooseDataDir() string {
return home + "/.local/share/rem"
}

func permanentlyDeleteFile(fileName string) {
err := os.Chmod(fileName, 0700) // If some files don't have the write permission, it is impossible to delete them
if os.IsNotExist(err) { // If we try to empty an already emptied trash, we will try to remove a non-existent log file. As the chmod is not critical, no error needs to be raised
return
func permanentlyDeleteFile(fileName string) error {
err := os.RemoveAll(fileName)
if err == nil {
return nil
}
i, _ := os.Stat(fileName)
if i.IsDir() { // As the chmod is not recursive, we must manually crawl through the trash to chmod and remove all files by hand
f, _ := os.Open(fileName)
files, _ := f.Readdir(0)
for _, subFile := range files {
permanentlyDeleteFile(fileName + "/" + subFile.Name())
}
err = os.Chmod(fileName, 0700) // make sure we have write permission
if err != nil {
return err
}
err = os.Remove(fileName)
i, err := os.Stat(fileName)
if err != nil {
handleErr(err)
return err
}
if i.IsDir() { // recursively chmod
f, err := os.Open(fileName)
if err != nil {
return err
}
files, err := f.Readdir(0)
if err != nil {
return err
}
for _, subFile := range files {
err = permanentlyDeleteFile(fileName + "/" + subFile.Name())
if err != nil {
return err
}
}
}
err = os.RemoveAll(fileName)
return err
}

// Utilities:
Expand Down

0 comments on commit 7ad0602

Please sign in to comment.