diff --git a/flow b/flow new file mode 100755 index 0000000..886223c --- /dev/null +++ b/flow @@ -0,0 +1,153 @@ +#!/usr/bin/python3 + +import os +import hashlib +from subprocess import run + +build_files_src = {} +build_files_level = {} +build_files_toBuild = {} + +def check_if_file(filename, build_file_name): + """ Checks it the given file exists, else print error and exit """ + if os.path.isfile(filename): + return True + else: + print("In " + build_file_name + " : " + filename + " is not a file") + exit(1) + +def getmd5(filename): + """ Takes Path to a file and get it's md5sum """ + with open(filename, 'rb') as file_to_check: + data = file_to_check.read() + md5_returned = hashlib.md5(data).hexdigest() + return md5_returned + +def get_meta_file(filename): + """ Takes src file name in build file and converts it to entry in .flow folder filename """ + fname = "" + for letter in filename: + if letter == "." or letter == "\\" or letter == "/": + pass + else: + fname += letter + return fname + +def update_md5(filename): + """ Takes the filename in .flow as var fname and updates it's md5sum value according to contents of var filename """ + fname = get_meta_file(filename) + with open(".flow/" + fname, "w") as f: + f.write(getmd5(filename).strip()) + + +def getstoredmd5(filename): + """ get value of file's md5 from .flow folder, else create entry. return the (md5, createdEntry)""" + md5_returned = "" + fname = get_meta_file(filename) + if fname in os.listdir(".flow"): + with open(".flow/" + fname, "r") as f: + md5_returned = f.readline() + else: + print("INFO : md5sum entry not present for " + filename + " creating one.") + update_md5(filename) + return md5_returned + +def recieved_file(filename, level, rebuild): + if build_files_toBuild.get(filename, False) == False: + build_files_toBuild[filename] = rebuild + if build_files_level.get(filename, -1) < level: + build_files_level[filename] = level + pass + + start, mid, end = "", "", "" + with open(filename, "r") as f: + x = f.read().split(";!run!;") + start = x[0] + y = x[1].split(";!end!;") + mid = y[0] + end = y[1] + + # start + src_files = [] + for line in start.split(): + entry = line.strip() + src_files.append(entry) + + build_files_src[filename] = src_files + + if rebuild: + build_files_toBuild[filename] = True + else: + for line in start.split(): + entry = line.strip() + check_if_file(entry, filename) + new_md5, old_md5 = "", "" + new_md5 = getmd5(entry) + old_md5 = getstoredmd5(entry) + + if old_md5 != new_md5: + print(entry + " was modified") + build_files_toBuild[filename] = True + + # mid + if build_files_toBuild[filename]: + with open(filename + ".temp", "w") as f: + f.write(mid) + + # end + for line in end.split(): + entry = line.strip() + check_if_file(entry, filename) + recieved_file(entry, level + 1, build_files_toBuild[filename]) + + + +def main(): + with open("build.flow", "r") as main_build_file: + if not os.path.exists(".flow"): + os.makedirs(".flow") + for line in main_build_file: + entry = line.strip() + + if os.path.isfile(entry): + recieved_file(entry, 0, False) + else: + print("ERROR : " + entry + " is neither a file or a directory") + exit(1) + + print(build_files_level) + print(build_files_src) + print(build_files_toBuild) + print() + print("┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ") + print() + + """ Build by using the data structures """ + for f, x in list(build_files_toBuild.items()): + if x == False: + del build_files_level[f] + del build_files_src[f] + del build_files_toBuild[f] + + levels_list = [] + for f,x in build_files_level.items(): + levels_list.append((f,x)) + + n = len(levels_list) + for i in range(n): + for j in range(0, n-i-1): + if levels_list[j][1] > levels_list[j+1][1]: + levels_list[j], levels_list[j+1] = levels_list[j+1], levels_list[j] + + for item in levels_list: + p = run([ "bash", item[0] + ".temp" ]) + if p.returncode != 0: + print(p) + exit(p.returncode) + + for item in levels_list: + build_file_name = item[0] + for src_file in build_files_src[build_file_name]: + update_md5(src_file) + +main()