From 8a05eaa0607aceb13ef449f978575a8f547a7428 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?B=C3=A1lint=20R=C3=A9thelyi?= <rethelyibalint@gmail.com>
Date: Tue, 23 Mar 2021 13:03:01 +0100
Subject: [PATCH] filelist

---
 plab/filelist.go | 125 +++++++++++++++++++++++++++++++++++++++++++++++
 plab/main.go     |   2 +-
 2 files changed, 126 insertions(+), 1 deletion(-)
 create mode 100644 plab/filelist.go

diff --git a/plab/filelist.go b/plab/filelist.go
new file mode 100644
index 0000000..1aef405
--- /dev/null
+++ b/plab/filelist.go
@@ -0,0 +1,125 @@
+package main
+
+import (
+	"fmt"
+	"git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/helpers"
+	"io/fs"
+	"io/ioutil"
+	"os/exec"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+	"unicode"
+)
+
+type fileinfo struct {
+	name  string
+	size  string
+	date  string
+	notes string
+}
+
+var Filelist = helpers.Subcommand{
+	Name: "filelist",
+	Command: func(args []string) {
+		if len(args) != 2 {
+			fmt.Println("usage: <dirname> <filelist>")
+			return
+		}
+
+		list := readFile(args[1])
+		list_map := mapizator(list)
+		files := getData(args[0], list_map)
+		genLatex(files)
+	},
+	Help: "generate file list", // TODO
+}
+
+func readFile(filename string) []string {
+	b, e := ioutil.ReadFile(filename)
+	if e != nil {
+		panic(e)
+	}
+	str := string(b)
+	return strings.Split(str, "\n")
+}
+
+func mapizator(list []string) map[string]string {
+	list_map := make(map[string]string)
+
+	for _, v := range list {
+		elements := strings.Split(v, "=")
+		list_map[elements[0]] = elements[1]
+	}
+	return list_map
+}
+
+func getCreateTime(filepath string) string {
+	b, e := exec.Command("git", "log", "--format=%ai", filepath).Output()
+	if e != nil {
+		b = make([]byte, 0)
+	}
+
+	str := string(b)
+	lines := strings.Split(str, "\n")
+	str = lines[len(lines)-1]
+
+	if strings.Contains(str, "") {
+		str = time.Now().Format("2006-01-02 15:04:05")
+	}
+
+	return str
+}
+
+func latexizeName(name string) string {
+	cop := ""
+	for i, ch := range name {
+		if i != 0 && unicode.IsUpper(ch) {
+			cop += `\-`
+		}
+		cop += string(ch)
+	}
+	return cop
+}
+
+func getData(dirname string, list map[string]string) []fileinfo {
+	var files []fileinfo
+
+	e := filepath.Walk(dirname, func(path string, info fs.FileInfo, err error) error {
+		if err != nil {
+			return err
+		}
+
+		if data, ok := list[info.Name()]; ok {
+			file := fileinfo{
+				name:  latexizeName(info.Name()),
+				size:  strconv.FormatInt(info.Size(), 10) + " byte",
+				date:  getCreateTime(path + info.Name()),
+				notes: data,
+			}
+			files = append(files, file)
+		}
+
+		return nil
+	})
+
+	if e != nil {
+		panic(e)
+	}
+
+	return files
+}
+
+func genLatex(files []fileinfo) {
+	fmt.Println("\\newcolumntype{P}[1]{>{\\hspace{0pt}}p{#1}}") // TODO: rm % if needed
+	fmt.Println("\\noindent\\begin{xltabular}{\\textwidth}{|l|l|X|X|}")
+	fmt.Println("\\hline Fájlnév & Méret & Keletkezés ideje & Tartalom \\\\ \\hline \\hline \\endhead")
+
+	for _, file := range files {
+		fmt.Printf("%s & %s & %s & %s \\\\ \\hline\n", file.name, file.size, file.date, file.notes)
+	}
+
+	fmt.Println("\\end{xltabular}")
+
+}
diff --git a/plab/main.go b/plab/main.go
index db1be0c..2c68b13 100644
--- a/plab/main.go
+++ b/plab/main.go
@@ -6,7 +6,7 @@ import (
 )
 
 func main() {
-	mainCmds := helpers.CmdFrom(os.Args[0], "go projlab tool", Timetable, Javadoc, Classdiag, Check)
+	mainCmds := helpers.CmdFrom(os.Args[0], "go projlab tool", Timetable, Javadoc, Classdiag, Check, Filelist)
 	if len(os.Args) < 2 {
 		os.Args = append(os.Args, "help")
 	}
-- 
GitLab