summaryrefslogtreecommitdiff
path: root/support/ctan_chk/ctan_chk.gawk
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/ctan_chk/ctan_chk.gawk
Initial commit
Diffstat (limited to 'support/ctan_chk/ctan_chk.gawk')
-rw-r--r--support/ctan_chk/ctan_chk.gawk227
1 files changed, 227 insertions, 0 deletions
diff --git a/support/ctan_chk/ctan_chk.gawk b/support/ctan_chk/ctan_chk.gawk
new file mode 100644
index 0000000000..805f5ab82b
--- /dev/null
+++ b/support/ctan_chk/ctan_chk.gawk
@@ -0,0 +1,227 @@
+# section no34:*/
+# section no12:*/
+#
+# Program: ctan_chk.gawk
+#
+# Author: Dave Bone
+#
+# License:
+# This Source Code Form is subject to the terms of the GNU General Public License (version 3).
+# If a copy of the MPL was not distributed with this file,
+# You can obtain one at: "https://gnu.org/licenses/gpl.html".
+#
+# Purpose: Implementation of some suggested CTAN guidelines that an upload project should respect.
+# Correction functions help u cleanup the droppings.
+# See www.ctan.org website for "upload guideline" document
+# Read ctan_chk.pdf document describing the program with various run scenarios.
+#
+#
+# section no:12*/
+# section no14:*/
+function is_file_a_directory(filename,filetype)
+{
+x= "file \"%s\"";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+split(a,parts);
+filetype[1]= parts[2];
+xx= parts[2];
+str= "^directory$";
+if(xx~str){
+return 1;
+}
+return 0;
+}
+# section no:14*/
+# section no15:*/
+function is_file_an_executable(filename,filetype)
+{
+x= "file %s";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+split(a,parts);
+filetype[1]= parts[2];
+xx= parts[2];
+str= "(executable|POSIX|Mach-O|ELF)$";
+if(xx~str){
+return 1;
+}
+return 0;
+}
+# section no:15*/
+# section no17:*/
+function chk_auxiliary_files(filename)
+{
+if(is_file_a_directory(filename)==1)
+return 0;
+str= "\\.(ps|gitignore|git|aux|log|bbl|bcf|blg|brf|ilg|ind|idx|glo|loa|lof|lot|nav|out|snm|vrb|toc|dvi|glg|gls|tmp|o|bak|mpx|scn|toc)$";
+if(filename~str){
+a= "\"%s\" 'Auxilary file to be deleted'";
+b= sprintf(a,filename);
+print b;
+#delete_file(filename);
+return 1;
+}
+return 0;
+}
+# section no:17*/
+# section no25:*/
+function remove_file_s_extended_attributes(filename,message)
+{
+x= "echo %s\";xattr -c %s";
+y= sprintf(x,message,filename);
+print y;
+#y|getline a;
+#close(y);
+}
+# section no:25*/
+# section no21:*/
+function chk_file_permissions(filename)
+{
+filetype[1]= "";
+if(is_file_a_directory(filename,filetype)==1)
+return 0;
+if(is_file_an_executable(filename,filetype)==1)
+return 0;
+x= "ls -al \"%s\"";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+number_fields= split(a,parts);
+str= "x";
+if(parts[1]~str){
+a= "\"%s\" 'Write permissions %s to possibly delete file type: %s'";
+b= sprintf(a,filename,parts[1],filetype[1]);
+print b;
+return 1;
+}
+return 0;
+}
+# section no:21*/
+# section no18:*/
+function chk_extended_file_attributes(filename)
+{
+x= "ls -al \"%s\"";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+number_of_fields= split(a,parts);
+if(number_of_fields<9)
+return 0;
+xx= parts[1];
+str= "(@|+)$";
+if(xx!~str){
+return 0;
+}
+a= "\"%s\" 'Extended attributes %s'";
+b= sprintf(a,filename,parts[1]);
+print b;
+#remove_file_s_extended_attributes(filename,b);
+return 1;
+}
+# section no:18*/
+# section no19:*/
+function chk_empty_files(filename)
+{
+if(is_file_a_directory(filename)==1)
+return 0;
+x= "ls -al \"%s\"";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+number_of_fields= split(a,parts);
+if(number_of_fields<9)
+{
+print"ERROR ===> ls -al should be 9 fields and it isn't: "a" no fields: "number_of_fields;
+return 0;
+}
+i= strtonum(parts[5]);
+if(i> 0){
+return 0;
+}
+a= "\"%s\" 'Empty file to be deleted'";
+b= sprintf(a,filename);
+print b;
+#delete_file(filename);
+return 1;
+}
+# section no:19*/
+# section no20:*/
+function chk_empty_directory(filename)
+{
+if(is_file_a_directory(filename)==0)
+return 0;
+x= "du -sk \"%s\"";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+number_of_fields= split(a,parts);
+i= strtonum(parts[1]);
+if(i> 0)
+return 0;
+a= "\"%s\" 'Empty directory to be deleted or needs to add info.txt file inside it'";
+b= sprintf(a,filename);
+print b;
+return 1;
+}
+# section no:20*/
+# section no26:*/
+function delete_file(filename)
+{
+x= "rm -i \"%s\"";
+y= sprintf(x,filename);
+y|getline a;
+close(y);
+}
+# section no:26*/
+# section no22:*/
+function chk_file_to_bypass_in_zip(filename)
+{
+str= ".(DS_Store|.nbattrs)$";
+if(filename~str){
+a= "\"%s\" 'Bypass file in zip'";
+b= sprintf(a,filename);
+print b;
+return 1;
+}
+return 0;
+}
+# section no:22*/
+# section no28:*/
+function pass1_guidelines_verify(filename)
+{
+chk_auxiliary_files(filename);
+chk_extended_file_attributes(filename);
+chk_empty_files(filename);
+chk_empty_directory(filename);
+chk_file_permissions(filename);
+chk_file_to_bypass_in_zip(filename);
+}
+# section no:28*/
+# section no29:*/
+function pass2_correct(filename,message)
+{
+#remove_file_s_execute_attribute(filename,message);
+#remove_file_s_extended_attributes(filename,message);
+#delete_file(filename);
+}
+# section no:29*/
+# section no31:*/
+BEGIN{
+rec_cnt= 0;
+}
+# section no:31*/
+# section no32:*/
+{
+pass1_guidelines_verify($1);
+#pass2_correct($1,$2);
+}
+# section no:32*/
+# section no33:*/
+END{
+#print "no records read: " NR;
+}
+# section no:33*/
+# section no:34*/