compareDirs.pyw
# ------------------------------------------------------------------------------#
import os,time;

from PySide2.QtWidgets import QApplication,QMainWindow,QFileDialog;
from PySide2.QtCore import QCoreApplication;

# ------------------------------------------------------------------------------#

from pyfiles import ui_compareDirs as uicompD;
from pyfiles import compare_dirs_by_content as compdirs;

# ------------------------------------------------------------------------------#

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow,self).__init__();
        self.ui=uicompD.Ui_MainWindow();
        self.ui.setupUi(self);

        # ----------------------------------------------------------------------#

        self.ui.openDirName1Button.clicked.connect(self.setOpenDir1Name);
        self.ui.openDirName2Button.clicked.connect(self.setOpenDir2Name);
        self.ui.compareDirsButton.clicked.connect(self.doCompare);
        self.ui.helpButton.clicked.connect(self.doHelp);

    # end def __init__

    # --------------------------------------------------------------------------#
    # --------------------------------------------------------------------------#

    def setOpenDir1Name(self):
        options=QFileDialog.DontResolveSymlinks \
                | QFileDialog.ShowDirsOnly;
        DirName=QFileDialog.getExistingDirectory(self,
                                                 "Open Directory",
                                                 self.ui.DirName1LineEdit.text(),options);
        if DirName:
            self.ui.DirName1LineEdit.setText(DirName);

    # end def setOpenDir1Name

    def setOpenDir2Name(self):
        options=QFileDialog.DontResolveSymlinks \
                | QFileDialog.ShowDirsOnly;
        DirName=QFileDialog.getExistingDirectory(self,
                                                 "Open Directory",
                                                 self.ui.DirName2LineEdit.text(),options);
        if DirName:
            self.ui.DirName2LineEdit.setText(DirName);

    # end def setOpenDir2Name

    def doHelp(self):
        TB=self.ui.showResultTextBrowser;

        doOutput(TB,'\n# Purpose:');
        doOutput(TB,'#     The script compares the text files of two directories,');
        doOutput(TB,'#     files with a given extension, ignoring differences');
        doOutput(TB,'#     in white space the following way: For byte by byte');
        doOutput(TB,'#     comparison sequences of white space characters are');
        doOutput(TB,'#     condensed to just one minimal empty space character.');
        doOutput(TB,"#     If the option 'No White Space' is set, all white space");
        doOutput(TB,"#     will be eliminated.");
        doOutput(TB,'#');
        doOutput(TB,'#  Note:');
        doOutput(TB,"#      The extension begins with a dot '.'. Directory names");
        doOutput(TB,'#      may be relative oe absolute. A Separator at the end');
        doOutput(TB,'#      of a name is optional. Names containing empty spaces');
        doOutput(TB,'#      must be enclosed by quotation marks.');
        doOutput(TB,'#');
        doOutput(TB,'#  For different files');
        doOutput(TB,"#     The first different non white character is marked with");
        doOutput(TB,"#     a '^'. Its position in the files is named 'At' in the output.");
        doOutput(TB,"#     'L1-L2' is the difference of lengths of files. These numbers");
        doOutput(TB,'#     are numbers for internal files with all substrings');
        doOutput(TB,'#     "[ \\t\\n\\r\\f\\v]+" replaced by just ');
        doOutput(TB,'#     one (or none) empty space character.');
        doOutput(TB,'');

    # end doHelp()

    def doCompare(self):
        DirName1=self.ui.DirName1LineEdit.text();
        DirName2=self.ui.DirName2LineEdit.text();

        TB=self.ui.showResultTextBrowser;

        if (DirName1!="") and (DirName2!=""):
            if (DirName1!=DirName2):
                MatchCase=self.ui.matchCaseCheckBox.isChecked();
                Extension=self.ui.fileExtensionComboBox.currentText();
                NoSpaceAtAll=self.ui.noSpaceRadioButton.isChecked();

                if not DirName1.endswith(os.sep):
                    # DirName1 += os.sep # ### TO_BE_DONE ###
                    DirName1+='/';
                # end if

                if not DirName2.endswith(os.sep):
                    # DirName2 += os.sep # ### TO_BE_DONE ###
                    DirName2+='/';
                # end if

                timeStamp=time.strftime("%d.%m.%Y, %H:%M:%S");

                doOutput(TB,'# Comparing contents of files - apart from white space ...');
                doOutput(TB,'# '+timeStamp+'\n');
                doOutput(TB,'# File extension:  '+Extension);
                doOutput(TB,'# Match case:      '+str(MatchCase));
                doOutput(TB,'# No space at all: '+str(MatchCase));
                doOutput(TB,'\n# Directory 1: '+DirName1);
                doOutput(TB,'# Directory 2: '+DirName2);

                self.ui.compareDirsButton.setEnabled(False);
                self.ui.helpButton.setEnabled(False);
                self.ui.compareProgressBar.setEnabled(True);
                self.ui.compareProgressBar.setMaximum(0);

                QCoreApplication.processEvents();

                try:
                    Outputs=compdirs.compareDirs(DirName1,
                                                 DirName2,
                                                 Extension,
                                                 MatchCase,
                                                 NoSpaceAtAll);
                    self.ui.compareProgressBar.setEnabled(False);
                    self.ui.compareProgressBar.setMaximum(100);
                    self.ui.compareDirsButton.setEnabled(True);
                    self.ui.helpButton.setEnabled(True);

                    for l in Outputs: doOutput(TB,l);

                    doOutput(TB,'\n# Compared.');

                except:
                    self.ui.compareProgressBar.setEnabled(False);
                    self.ui.compareProgressBar.setMaximum(100);
                    self.ui.compareDirsButton.setEnabled(True);
                    self.ui.helpButton.setEnabled(True);

                    doOutput(TB,'\n\n! File ERROR - An exception occured.');
                    doOutput(TB,'             - Note: The files must be text files.');
                # end try

            else:
                doOutput(TB,'\n! Input ERROR - The names of the directories are identical!');
            # end if
        # end if
    # end def doCompare()

def doOutput(TextBrowser,Text):
    TextBrowser.append(Text);

# end doOutput()

# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#

if __name__=='__main__':
    import sys;

    app=QApplication(sys.argv);
    window=MainWindow();
    window.show();

    window.ui.DirName1LineEdit.setText("");
    window.ui.DirName2LineEdit.setText("");

    sys.exit(app.exec_());
# end if

# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#