def parse(conf_raw): # remove comments conf_raw = re.sub(r" *#.*?(\n|$)", "", conf_raw) # trim spaces and tabs conf_raw = re.sub(r"(?<=\n)( |\t)*|( |\t)*(?=\n)", "", conf_raw) # remove empty lines (start|middle|end) conf_raw = re.sub(r"^\n+|(?<=\n)\n+|\n+$", "", conf_raw) # split by lines conf_lines = conf_raw.split("\n") # prepare dict conf_dict = { 'FLAGS':[], 'ROOT':[], 'NOCOPY':[], 'NOREMOVE':[], 'PATHS':[] } # define option variables opt_name = None opt_pair = None # parse into dict for conf_line in conf_lines: # check for an [option header] opt_match = re.search("(?<=\[).*?(?=\])", conf_line) if opt_match: # add new option opt_name = opt_match.group(0) # check for default option, else is path pair opt_pair = opt_name not in conf_dict if opt_pair: # parse path pair into list opt_pair = parse_dir_pattern(opt_name) elif opt_name: # add to current option if opt_pair: file_pair = parse_file_pattern(conf_line) for n in [0,1]: file_pair[n] = add_root_path(file_pair[n], opt_pair[n]) conf_dict['PATHS'].append(file_pair) else: if opt_name == 'ROOT': var = format_dir_path(conf_line) elif opt_name == 'FLAGS': var = conf_line else: var = format_file_path(conf_line) conf_dict[opt_name].append(var) # set each flag if it wasn't passed from cli for name in conf_dict['FLAGS']: if ARG.get(name) == None: ARG.set(name, True) return conf_dict['ROOT'], conf_dict['PATHS'], conf_dict['NOCOPY'], conf_dict['NOREMOVE']
def cli_init(): global ARG; ARG.description('Berthes') ARG.add('COPY', opt='cp', help='copy to backup dirs') ARG.add('ASKCOPY', opt='acp', help='ask for each copy') ARG.add('CLEAN', opt='cl', help='clean backup dirs') ARG.add('ASKREMOVE', opt='arm', help='ask for each remove') ARG.add('DRYRUN', opt='dr', help='perform a dry run') ARG.add('VERBOSE', opt='v', help='be verbose') ARG.parser.add_argument('-conf', metavar='conf_path', help='path to config file') ARG.parse()