diff --git a/redirect.py b/redirect.py index f814d9e..117a8ea 100755 --- a/redirect.py +++ b/redirect.py @@ -24,6 +24,7 @@ mapRegex = re.compile(r"^[^\"]+)\">[^<>]+ allProtoRegex = re.compile(r"^[a-z+]+:/*(?!/)") protoReplaceRegex = re.compile(r"^https?://") lineReplaceRegex = re.compile(r"^\s*deb(-src)? ") +lineUrlRegex = re.compile(r"(?<=\s)[a-z+]+:/*(?!/)\S+(?!\S)") ## Code @@ -86,7 +87,7 @@ def url_to_regex(url, multi_mapping=multi_mapping): if not is_multi_mapped: url_pattern = re.escape(url) # Prefix protocol again - return r"https?://" + url_pattern + r"/?" + return r"https?://" + url_pattern else: return re.escape(url) @@ -96,9 +97,41 @@ def modifyMap(d): def isDebLine(line): return lineReplaceRegex.search(line) is not None -def checkFile(source_file, mapping): +def check_line(line, mapping): global mirror_mode global mirror_path + global write_mode + for old_pattern, new_url in mapping.items(): + old_match = old_pattern.search(line) + if old_match: + changed = True + verb(f"{line}") + if mirror_mode: + old_prefix = old_match.group(0) + old_url_match = lineUrlRegex.search(line) + if not old_url_match: + raise Exception(f"URL '{old_prefix}' not found in line '{line}', report this to the developer") + old_url = old_url_match.group(0) + old_suffix = old_url[len(old_prefix):] + if (old_prefix + old_suffix) != old_url: + raise Exception(f"URL '{old_prefix}' not matching in line '{line}', report this to the developer") + mirror_file = mirror_path / (hashlib.sha256(old_url.encode('utf-8')).hexdigest() + ".lst") + if write_mode: + if not mirror_path.exists(): + mirror_path.mkdir() + if not mirror_file.exists(): + mirror_file.write_text(f"{new_url}{old_suffix} priority:1\n{old_url} priority:9\n") + new_line = lineUrlRegex.sub('mirror+file:' + str(mirror_file.resolve()), line) + else: + new_line = old_pattern.sub(new_url, line) + verb(f"-> {new_line} # {new_url}{old_suffix}", add=-3) + line = new_line + break + else: + verb(f"= {line}", add=-2) + return line + +def checkFile(source_file, mapping): global write_mode verb(("Run replacements on" if write_mode else "Check") + f" {source_file}:") with verbLevelContext(): @@ -112,28 +145,7 @@ def checkFile(source_file, mapping): for line in f: line = line[:-1] # Remove newline character if isDebLine(line): - for old_pattern, new_url in mapping.items(): - old_match = old_pattern.search(line) - if old_match: - changed = True - old_url = old_match.group(0) - verb(f"{line}") - if mirror_mode: - mirror_file = mirror_path / (hashlib.sha256(old_pattern.pattern.encode('utf-8')).hexdigest() + ".lst") - new_line = old_pattern.sub('mirror+file:' + str(mirror_file.resolve()), line) - if write_mode: - if not mirror_path.exists(): - mirror_path.mkdir() - if not mirror_file.exists(): - mirror_file.write_text(f"{new_url} priority:1") - mirror_file.write_text(f"{old_url} priority:9") - else: - new_line = old_pattern.sub(new_url, line) - verb(f"-> {new_line} # {new_url}", add=-3) - line = new_line - break - else: - verb(f"= {line}", add=-2) + line = check_line(line, mapping) if write_mode: newFile.write(line + "\n") if write_mode and changed: