/usr/share/nautilus-python/extensions/nautilus-hide.py is in nautilus-hide 0.1.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | # Nautilus Hide - Extension for Nautilus to hide files without renaming them
# Copyright (C) 2015 Bruno Nova <brunomb.nova@gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
from gi.repository import Nautilus, GObject
from gettext import ngettext, locale, bindtextdomain, textdomain
class NautilusHide(Nautilus.MenuProvider, GObject.GObject):
"""Simple Nautilus extension that adds some actions to the context menu to
hide and unhide files, by adding/removing their names to/from the folder's
'.hidden' file."""
def __init__(self):
pass
def get_file_items(self, window, files):
"""Returns the menu items to display when one or more files/folders are
selected."""
# Make "files" paths relative and remove files that start with '.'
# or that end with '~' (files that are already hidden)
dir_path = None # path of the directory
filenames = []
for file in files:
if dir_path == None: # first file: find path to directory
dir_path = file.get_parent_location().get_path()
if file.get_uri_scheme() != "file": # must be a local directory
return
name = file.get_name()
if not name.startswith(".") and not name.endswith("~"):
filenames += [name]
if dir_path == None or len(filenames) == 0:
return
# Check if the user has write access to the ".hidden" file and its
# directory
hidden_path = dir_path + "/.hidden" # path to the ".hidden" file
if not os.access(dir_path, os.W_OK | os.X_OK) or \
(os.path.exists(hidden_path) and not os.access(hidden_path, os.R_OK | os.W_OK)):
return
# Read the ".hidden" file
try:
hidden = set()
if os.path.exists(hidden_path):
with open(hidden_path) as f:
for line in f.readlines():
line = line.strip("\r\n") # strip newline characters
if line != "":
hidden.add(line)
except: # ".hidden" file was deleted?
hidden = set()
# Determine what menu items to show (Hide, Unhide, or both)
show_hide, show_unhide = False, False
for file in filenames:
if file in hidden:
show_unhide = True
else:
show_hide = True
if show_hide and show_unhide:
break
# Add the menu items
items = []
self._setup_gettext();
if show_hide:
items += [self._create_hide_item(filenames, hidden_path, hidden)]
if show_unhide:
items += [self._create_unhide_item(filenames, hidden_path, hidden)]
return items
def _setup_gettext(self):
"""Initializes gettext to localize strings."""
try: # prevent a possible exception
locale.setlocale(locale.LC_ALL, "")
except:
pass
bindtextdomain("nautilus-hide", "/usr/share/locale")
textdomain("nautilus-hide")
def _create_hide_item(self, files, hidden_path, hidden):
"""Creates the 'Hide file(s)' menu item."""
item = Nautilus.MenuItem(name="NautilusHide::HideFile",
label=ngettext("_Hide File", "_Hide Files", len(files)),
tip=ngettext("Hide this file", "Hide these files", len(files)))
item.connect("activate", self._hide_run, files, hidden_path, hidden)
return item
def _create_unhide_item(self, files, hidden_path, hidden):
"""Creates the 'Unhide file(s)' menu item."""
item = Nautilus.MenuItem(name="NautilusHide::UnhideFile",
label=ngettext("Un_hide File", "Un_hide Files", len(files)),
tip=ngettext("Unhide this file", "Unhide these files", len(files)))
item.connect("activate", self._unhide_run, files, hidden_path, hidden)
return item
def _update_hidden_file(self, hidden_path, hidden):
"""Updates the '.hidden' file with the new filenames, or deletes it if
empty (no files to hide)."""
try:
if hidden == set():
if os.path.exists(hidden_path):
os.remove(hidden_path)
else:
with open(hidden_path, "w") as f:
for file in hidden:
f.write(file + '\n')
# Nautilus should be refreshed here. But how to do that?
except:
print("Failed to delete or write to {}!".format(hidden_path))
def _hide_run(self, menu, files, hidden_path, hidden):
"""'Hide file(s)' menu item callback."""
for file in files:
hidden.add(file)
self._update_hidden_file(hidden_path, hidden)
def _unhide_run(self, menu, files, hidden_path, hidden):
"""'Unhide file(s)' menu item callback."""
for file in files:
try:
hidden.remove(file)
except: # file not in "hidden"
pass
self._update_hidden_file(hidden_path, hidden)
|