--- gamin-0.1.10/python/gamin.py.orig	2007-07-04 15:36:48.000000000 +0000
+++ gamin-0.1.10/python/gamin.py	2023-01-25 17:45:14.040421915 +0000
@@ -36,7 +36,7 @@
 
 def GaminErrmsg(err = None):
     if err == None:
-	err = _gamin.Errno()
+       err = _gamin.Errno()
     if err == GAM_ARG:
         msg = "bad argument error"
     elif err == GAM_FILE:
@@ -58,199 +58,199 @@
 class GaminException(Exception):
     def __init__(self, value):
         Exception.__init__(self)
-	self.value = value
-	self.errno = GaminErrno()
+        self.value = value
+        self.errno = GaminErrno()
 
     def __str__(self):
         str = GaminErrmsg(self.errno)
-	if str != "":
+        if str != "":
             return repr(self.value) + ': ' + str
         return repr(self.value)
 
 class WatchMonitor:
     """This is a wrapper for a FAM connection. It uses a single connection
-       to the gamin server, over a socket. Use get_fd() to get the file
-       descriptor which allows to plug it in an usual event loop. The
-       watch_directory(), watch_file() and stop_watch() are direct mapping
-       to the FAM API. The event raised are also a direct mapping of the
-       FAM API events."""
+    to the gamin server, over a socket. Use get_fd() to get the file
+    descriptor which allows to plug it in an usual event loop. The
+    watch_directory(), watch_file() and stop_watch() are direct mapping
+    to the FAM API. The event raised are also a direct mapping of the
+    FAM API events."""
 
     class WatchObject:
-	def __init__ (self, monitor, mon_no, path, dir, callback, data=None):
-	    self.monitor = monitor
-	    self.callback = callback
-	    self.data = data
-	    self.path = path
-	    self.__mon_no = mon_no
-	    if dir == 1:
-		ret = _gamin.MonitorDirectory(self.__mon_no, path, self);
-		if ret < 0:
-		    raise(GaminException("Failed to monitor directory %s" %
-					 (path)))
-	    elif dir == 0:
-		ret = _gamin.MonitorFile(self.__mon_no, path, self);
-		if ret < 0:
-		    raise(GaminException("Failed to monitor file %s" %
-					 (path)))
-	    elif dir == -1:
-		ret = _gamin.MonitorDebug(self.__mon_no, path, self);
-		if ret < 0:
-		    raise(GaminException("Failed to debug %s" %
-					 (path)))
-	    self.__req_no = ret
+        def __init__ (self, monitor, mon_no, path, dir, callback, data=None):
+            self.monitor = monitor
+            self.callback = callback
+            self.data = data
+            self.path = path
+            self.__mon_no = mon_no
+            if dir == 1:
+                ret = _gamin.MonitorDirectory(self.__mon_no, path, self);
+                if ret < 0:
+                    raise(GaminException("Failed to monitor directory %s" %
+                                         (path)))
+                elif dir == 0:
+                    ret = _gamin.MonitorFile(self.__mon_no, path, self);
+                    if ret < 0:
+                        raise(GaminException("Failed to monitor file %s" %
+                                         (path)))
+                elif dir == -1:
+                    ret = _gamin.MonitorDebug(self.__mon_no, path, self);
+                    if ret < 0:
+                        raise(GaminException("Failed to debug %s" %
+                                         (path)))
+                self.__req_no = ret
 
-	def _internal_callback(self, path, event):
+        def _internal_callback(self, path, event):
 	    # it is very important here to catch all exception which may
 	    # arise in the client callback code.
-	    try:
-		if self.data != None:
-		    self.callback (path, event, self.data)
-		else:
-		    self.callback (path, event)
-	    except:
-		import traceback 
-		traceback.print_exc()
-
-	    if event == GAMAcknowledge:
-	        try:
-		    self.monitor.cancelled.remove(self)
-		except:
-		    print "gamin failed to remove from cancelled"
-		    pass
-
-	def cancel(self):
-	    ret = _gamin.MonitorCancel(self.__mon_no, self.__req_no);
-	    if ret < 0:
-		raise(GaminException("Failed to stop monitor on %s" %
-				     (self.path)))
-	    try:
-		self.monitor.cancelled.append(self)
-	    except:
-	        print "gamin cancel() failed to add to cancelled"
+            try:
+                if self.data != None:
+                    self.callback (path, event, self.data)
+                else:
+                    self.callback (path, event)
+            except:
+                import traceback 
+                traceback.print_exc()
+
+            if event == GAMAcknowledge:
+                try:
+                    self.monitor.cancelled.remove(self)
+                except:
+                    print("gamin failed to remove from cancelled")
+                    pass
+
+        def cancel(self):
+            ret = _gamin.MonitorCancel(self.__mon_no, self.__req_no);
+            if ret < 0:
+                raise(GaminException("Failed to stop monitor on %s" %
+                                     (self.path)))
+            try:
+                self.monitor.cancelled.append(self)
+            except:
+                print("gamin cancel() failed to add to cancelled")
 
     def __init__ (self):
         self.__no = _gamin.MonitorConnect()
-	if self.__no < 0:
-	    raise(GaminException("Failed to connect to gam_server"))
-	self.objects = {}
-	self.__fd = _gamin.GetFd(self.__no)
-	if self.__fd < 0:
-	    _gamin.MonitorClose(self.__no)
-	    raise(GaminException("Failed to get file descriptor"))
-	self.cancelled = []
+        if self.__no < 0:
+            raise(GaminException("Failed to connect to gam_server"))
+        self.objects = {}
+        self.__fd = _gamin.GetFd(self.__no)
+        if self.__fd < 0:
+            _gamin.MonitorClose(self.__no)
+            raise(GaminException("Failed to get file descriptor"))
+        self.cancelled = []
 
     def __del__ (self):
         self.disconnect()
     
     def __raise_disconnected():
-	raise(GaminException("Already disconnected"))
+        raise(GaminException("Already disconnected"))
         
     def _debug_object(self, value, callback, data = None):
         if has_debug_api == 0:
-	    return;
+            return;
 
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         obj = self.WatchObject(self, self.__no, value, -1, callback, data)
 	# persistency need to be insured
-	self.objects["debug"] = obj
-	return obj
+        self.objects["debug"] = obj
+        return obj
 
     def disconnect(self):
         if (self.__no >= 0):
-	    _gamin.MonitorClose(self.__no)
-	self.__no = -1;
+            _gamin.MonitorClose(self.__no)
+        self.__no = -1;
 
     def watch_directory(self, directory, callback, data = None):
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         directory = os.path.abspath(directory)
 
         obj = self.WatchObject(self, self.__no, directory, 1, callback, data)
         if self.objects.has_key(directory):
-	    self.objects[directory].append(obj)
-	else:
-	    self.objects[directory] = [obj]
-	return obj
+            self.objects[directory].append(obj)
+        else:
+            self.objects[directory] = [obj]
+        return obj
 
     def watch_file(self, file, callback, data = None):
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         file = os.path.abspath(file)
 
         obj = self.WatchObject(self, self.__no, file, 0, callback, data)
         if self.objects.has_key(file):
-	    self.objects[file].append(obj)
-	else:
-	    self.objects[file] = [obj]
-	return obj
+            self.objects[file].append(obj)
+        else:
+            self.objects[file] = [obj]
+        return obj
 
     def no_exists(self):
         if (self.__no < 0):
-	    return
-	ret = _gamin.MonitorNoExists(self.__no)
-	return ret
+            return
+        ret = _gamin.MonitorNoExists(self.__no)
+        return ret
 
     def stop_watch(self, path):
         if (self.__no < 0):
-	    return
+            return
         path = os.path.abspath(path)
-	try:
-	    list = self.objects[path]
-	except:
-	    raise(GaminException("Resource %s is not monitored" % (path)))
-	for obj in list:
-	    obj.cancel()
-	self.objects[path] = []
-	
+        try:
+            list = self.objects[path]
+        except:
+            raise(GaminException("Resource %s is not monitored" % (path)))
+        for obj in list:
+            obj.cancel()
+        self.objects[path] = []
+
     def get_fd(self):
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         return self.__fd
 
     def event_pending(self):
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         ret = _gamin.EventPending(self.__no);
-	if ret < 0:
-	    raise(GaminException("Failed to check pending events"))
-	return ret
+        if ret < 0:
+            raise(GaminException("Failed to check pending events"))
+        return ret
 
     def handle_one_event(self):
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         ret = _gamin.ProcessOneEvent(self.__no);
-	if ret < 0:
-	    raise(GaminException("Failed to process one event"))
-	return ret
+        if ret < 0:
+            raise(GaminException("Failed to process one event"))
+        return ret
 
     def handle_events(self):
         if (self.__no < 0):
-	    self.__raise_disconnected();
+            self.__raise_disconnected();
         ret = _gamin.ProcessEvents(self.__no);
-	if ret < 0:
-	    raise(GaminException("Failed to process events"))
-	return ret
+        if ret < 0:
+            raise(GaminException("Failed to process events"))
+        return ret
 
 def run_unit_tests():
     def callback(path, event):
-        print "Got callback: %s, %s" % (path, event)
+        print("Got callback: %s, %s") % (path, event)
     mon = WatchMonitor()
-    print "watching current directory"
+    print("watching current directory")
     mon.watch_directory(".", callback)
     import time
     time.sleep(1)
-    print "fd: ", mon.get_fd()
+    print("fd: "), mon.get_fd()
     ret = mon.event_pending()
-    print "pending: ", ret
+    print("pending: "), ret
     if ret > 0:
         ret = mon.handle_one_event()
-	print "processed %d event" % (ret)
-	ret = mon.handle_events()
-	print "processed %d remaining events" % (ret)
-    print "stop watching current directory"
+        print("processed %d event") % (ret)
+        ret = mon.handle_events()
+        print("processed %d remaining events") % (ret)
+    print("stop watching current directory")
     mon.stop_watch(".")
-    print "disconnecting"
+    print("disconnecting")
     del mon
 
 if __name__ == '__main__':
