From bbcfe1ebabeb481a275f8a8837ea2884cccf7c4f Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Fri, 16 Apr 2021 18:52:36 -0700
Subject: [PATCH] Optionally include newest-file-in-archive date/time and other
 features

---
 exec/filelist.js | 114 +++++++++++++++++++++++++++++------------------
 1 file changed, 71 insertions(+), 43 deletions(-)

diff --git a/exec/filelist.js b/exec/filelist.js
index 7092a8ca24..efe62f9d6e 100755
--- a/exec/filelist.js
+++ b/exec/filelist.js
@@ -12,9 +12,22 @@ function datestr(t)
 	return system.datestr(t);
 }
 
+function archive_date(file)
+{
+	try {
+		var list = Archive(file).list();
+	} catch(e) {
+		return file_date(file);
+	}
+	var t = 0;
+	for(var i = 0; i < list.length; i++)
+		t = Math.max(list[i].time, t);
+	return t;
+}
+
 var sort_prop = "name";
 var exclude_list = [];
-var options = { sort: false};
+var options = { sort: false, case_sensitive: true };
 var json_space;
 var detail = -1;
 var dir_list = [];
@@ -55,19 +68,21 @@ for(var i = 0; i < argc; i++) {
 			writeln("  -lib=<name>     list files in all directories of specified library");
 			writeln("  -ex=<filespec>  add filename or spec to excluded filename list");
 			writeln("  -hdr            include header for each directory");
-			writeln("  -sort[=prop]    enable case-sensitive output sorting");
-			writeln("  -isort[=prop]   enable case-insensitive output sorting");
+			writeln("  -sort[=prop]    enable/configure file sorting");
+			writeln("  -i              perform case-insensitive global sorting");
 			writeln("  -reverse        reverse the sort order");
 			writeln("  -json[=spaces]  use JSON formatted output");
 			writeln("  -new=<days>     include new files uploaded in past <days>");
-			writeln("  -p=[list]       specify comma-separated list of property names to print");
+			writeln("  -p=<list>       specify comma-separated list of property names to print");
+			writeln("  -cdt            include credit value instead of file size");
 			writeln("  -ext            include extended file descriptions");
 			writeln("  -ext=<prefix>   specify extended file description prefix");
 			writeln("  -fmt=<fmt>      specify output format string (printf syntax)");
 			writeln("  -date=<fmt>     specify date/time display format (strftime syntax)");
 			writeln("  -size=<fmt>     specify size/byte display format (0-" + (size_fmts.length - 1) + ")");
-			writeln("  -name=<len>     specify filename length");
+			writeln("  -name=<len>     specify filename length (default: 12)");
 			writeln("  -pad            pad filename with spaces");
+			writeln("  -adate          use latest archived file date/time instead of file time");
 			writeln("  -v              increase verbosity (detail) of output");
 			exit(0);
 		}
@@ -108,9 +123,8 @@ for(var i = 0; i < argc; i++) {
 			options.sort = true;
 			continue;
 		}
-		if(opt.indexOf("isort=") == 0) {
-			sort_prop = opt.slice(6);
-			options.isort = true;
+		if(opt == "i") {
+			options.case_sensitive = false;
 			continue;
 		}
 		if(opt[0] == 'v') {
@@ -190,6 +204,11 @@ if(fmt != "json") {
 				offset += size_fmts[size_fmt][2] + 1;
 			}
 		}
+		if(detail > FileBase.DETAIL.EXTENDED) {
+			props.push("time");
+			f += " %-8s";
+			offset += 9;
+		}
 		if(detail >= FileBase.DETAIL.NORM) {
 			props.push("desc");
 			f += " %-58s";
@@ -226,13 +245,17 @@ for(var i = 0; i < dir_list.length; i++) {
 	if(!base.open())
 		throw new Error(base.last_error);
 	if(detail < 0)
-		file_list = file_list.concat(base.get_names(filespec, since, /* sort: */false));
+		file_list = file_list.concat(base.get_names(filespec, since, options.sort));
 	else {
-		var list = base.get_list(filespec, detail, since, /* sort: */false);
+		var list = base.get_list(filespec, detail, since, options.sort);
 		for(var j = 0; j < list.length; j++) {
 			list[j].dir = dir_code;
 			if(list[j].extdesc)
 				list[j].extdesc = "\n" + list[j].extdesc;
+			if(options.adate)
+				list[j].time = archive_date(base.get_path(list[j]));
+			if(options.cdt)
+				list[j].size = list[j].cost;
 		}
 		file_list = file_list.concat(list);
 	}
@@ -242,40 +265,42 @@ for(var i = 0; i < dir_list.length; i++) {
 if(!file_list.length)
 	exit(0);
 
-if(options.isort) {
-	log("Sorting " + file_list.length + " files...");
-	if(typeof file_list[0] == "string")
-		file_list.sort(
-			function(a, b) {
-				if (a.toLowerCase() < b.toLowerCase()) return -1;
-				if (a.toLowerCase() > b.toLowerCase()) return 1;
-				return 0;
-			}
-		);
-	else {
-		file_list.sort(
-			function(a, b) {
-				var a = String(a[sort_prop]).toLowerCase();
-				var b = String(b[sort_prop]).toLowerCase();
-				if (a < b) return -1;
-				if (a > b) return 1;
-				return 0;
-			}
-		);
+if(!options.hdr && options.sort) {
+	if(options.case_sensitive) {
+		log("Sorting " + file_list.length + " files...");
+		if(typeof file_list[0] == "string")
+			file_list.sort(
+				function(a, b) {
+					if (a.toLowerCase() < b.toLowerCase()) return -1;
+					if (a.toLowerCase() > b.toLowerCase()) return 1;
+					return 0;
+				}
+			);
+		else {
+			file_list.sort(
+				function(a, b) {
+					var a = String(a[sort_prop]).toLowerCase();
+					var b = String(b[sort_prop]).toLowerCase();
+					if (a < b) return -1;
+					if (a > b) return 1;
+					return 0;
+				}
+			);
+		}
 	}
-}
-else if(options.sort) {
-	log("Sorting " + file_list.length + " files...");
-	if(typeof file_list[0] == "string")
-		file_list.sort();
 	else {
-		file_list.sort(
-			function(a, b) {
-				if (a[sort_prop] < b[sort_prop]) return -1;
-				if (a[sort_prop] > b[sort_prop]) return 1;
-				return 0;
-			}
-		);
+		log("Sorting " + file_list.length + " files...");
+		if(typeof file_list[0] == "string")
+			file_list.sort();
+		else {
+			file_list.sort(
+				function(a, b) {
+					if (a[sort_prop] < b[sort_prop]) return -1;
+					if (a[sort_prop] > b[sort_prop]) return 1;
+					return 0;
+				}
+			);
+		}
 	}
 }
 if(options.reverse)
@@ -351,7 +376,10 @@ function list_file(file, fmt, props)
 		var p = file[name];
 		switch(typeof p) {
 			case "undefined":
-				a.push('');
+				if(name == 'desc')
+					a.push(file.name);
+				else
+					a.push('');
 				break;
 			case "string":
 				if(name == 'name')
-- 
GitLab