From bf4e5310547603bf36e67dc4cba027963f16508e Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ga=C3=ABl=20PORTAY?= <gael.portay@savoirfairelinux.com>
Date: Fri, 4 Nov 2016 11:53:48 -0400
Subject: [PATCH 1/3] Fix mixed tab/space indentation
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

CC="cc  -pipe -std=gnu99 -Wall -W -Wextra -fPIC -D_LARGEFILE64_SOURCE -D_ATFILE_SOURCE  -DPSEUDO_PREFIX='"/usr/local"' -DPSEUDO_SUFFIX='""' -DPSEUDO_BINDIR='"bin"' -DPSEUDO_LIBDIR='"lib64"' -DPSEUDO_LOCALSTATEDIR='"var/pseudo"' -DPSEUDO_VERSION='"1.8.1"' -DUSE_MEMORY_DB  -DPSEUDO_PASSWD_FALLBACK='""'   -DPSEUDO_XATTR_SUPPORT       -O2 -g " ./makewrappers "xattr=true"
  File "./makewrappers", line 327
    return """/* This function is not called if pseudo is configured --enable-force-async */
                                                                                           ^
TabError: inconsistent use of tabs and spaces in indentation

Signed-off-by: Gaël PORTAY <gael.portay@savoirfairelinux.com>
---
 makewrappers | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/makewrappers b/makewrappers
index e9191ed..303e2cc 100755
--- a/makewrappers
+++ b/makewrappers
@@ -324,7 +324,7 @@ class Function:
 
     def maybe_async_skip(self):
         if self.async_skip:
-	    return """/* This function is not called if pseudo is configured --enable-force-async */
+            return """/* This function is not called if pseudo is configured --enable-force-async */
 #ifdef PSEUDO_FORCE_ASYNC
 	if (!pseudo_allow_fsync) {
 		PROFILE_DONE;
@@ -333,7 +333,7 @@ class Function:
 #endif
 """ % self.async_skip
         else:
-	    return ""
+            return ""
 
     def comment(self):
         """declare self (in a comment)"""
@@ -393,11 +393,11 @@ class Function:
 
     def rc_format(self):
         """the format string to use for the return value"""
-	return typedata.get(self.type, { 'format': '[%s]', 'value': '"' + self.type + '"' })['format']
+        return typedata.get(self.type, { 'format': '[%s]', 'value': '"' + self.type + '"' })['format']
 
     def rc_value(self):
         """the value to pass for the format string for the return value"""
-	return typedata.get(self.type, { 'format': '[%s]', 'value': '"' + self.type + '"' })['value']
+        return typedata.get(self.type, { 'format': '[%s]', 'value': '"' + self.type + '"' })['value']
 
     def rc_decl(self):
         """declare rc (if needed)"""
@@ -456,7 +456,7 @@ additional ports to include.
         self.name = port
         self.subports = []
         self.preports = []
-	print port
+        print port
 
         if os.path.exists(self.portfile("pseudo_wrappers.c")):
             self.wrappers = self.portfile("pseudo_wrappers.c")
@@ -522,11 +522,11 @@ additional ports to include.
         return '#define PSEUDO_PORT_%s 1' % string.upper(self.name).replace('/', '_')
 
     def portdeps(self):
-	deps = []
-	if self.wrappers:
-	    deps.append(self.wrappers)
-	if self.portdef_file:
-	    deps.append(self.portdef_file)
+        deps = []
+        if self.wrappers:
+            deps.append(self.wrappers)
+        if self.portdef_file:
+            deps.append(self.portdef_file)
         if deps:
             return 'pseudo_wrappers.o: %s' % ' '.join(deps)
         else:
@@ -590,7 +590,7 @@ def main(argv):
 
     for arg in argv:
         name, value = arg.split('=')
-	os.environ["port_" + name] = value
+        os.environ["port_" + name] = value
 
     # error checking helpfully provided by the exception handler
     copyright_file = open('guts/COPYRIGHT')
@@ -599,9 +599,9 @@ def main(argv):
 
     for path in glob.glob('templates/*'):
         try:
-	    print "Considering template: " + path
+            print "Considering template: " + path
             source = TemplateFile(path)
-	    if source.name.endswith('.c') or source.name.endswith('.h'):
+            if source.name.endswith('.c') or source.name.endswith('.h'):
                 source.emit('copyright')
             source.emit('header')
             sources.append(source)
-- 
2.10.1

