diff -r 000000000000 -r 6474c204b198 config/createprecomplete.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/config/createprecomplete.py Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,75 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +# Creates the precomplete file containing the remove and rmdir application +# update instructions which is used to remove files and directories that are no +# longer present in a complete update. The current working directory is used for +# the location to enumerate and to create the precomplete file. +# For symlinks, remove instructions are always generated. + +import sys +import os + +def get_build_entries(root_path): + """ Iterates through the root_path, creating a list for each file and + directory. Excludes any file paths ending with channel-prefs.js. + To support Tor Browser updates, excludes: + TorBrowser/Data/Browser/profiles.ini + TorBrowser/Data/Browser/profile.default/bookmarks.html + TorBrowser/Data/Tor/torrc + """ + rel_file_path_set = set() + rel_dir_path_set = set() + for root, dirs, files in os.walk(root_path): + for file_name in files: + parent_dir_rel_path = root[len(root_path)+1:] + rel_path_file = os.path.join(parent_dir_rel_path, file_name) + rel_path_file = rel_path_file.replace("\\", "/") + if not (rel_path_file.endswith("channel-prefs.js") or + rel_path_file.endswith("update-settings.ini") or + rel_path_file == "TorBrowser/Data/Browser/profiles.ini" or + rel_path_file == "TorBrowser/Data/Browser/profile.default/bookmarks.html" or + rel_path_file == "TorBrowser/Data/Tor/torrc" or + rel_path_file.find("distribution/") != -1): + rel_file_path_set.add(rel_path_file) + + for dir_name in dirs: + parent_dir_rel_path = root[len(root_path)+1:] + rel_path_dir = os.path.join(parent_dir_rel_path, dir_name) + rel_path_dir = rel_path_dir.replace("\\", "/")+"/" + if rel_path_dir.find("distribution/") == -1: + if (os.path.islink(rel_path_dir[:-1])): + rel_file_path_set.add(rel_path_dir[:-1]) + else: + rel_dir_path_set.add(rel_path_dir) + + rel_file_path_list = list(rel_file_path_set) + rel_file_path_list.sort(reverse=True) + rel_dir_path_list = list(rel_dir_path_set) + rel_dir_path_list.sort(reverse=True) + + return rel_file_path_list, rel_dir_path_list + +def generate_precomplete(root_path): + """ Creates the precomplete file containing the remove and rmdir + application update instructions. The given directory is used + for the location to enumerate and to create the precomplete file. + """ + # If inside a Mac bundle use the root of the bundle for the path. + if os.path.basename(root_path) == "MacOS": + root_path = os.path.abspath(os.path.join(root_path, '../../')) + + rel_file_path_list, rel_dir_path_list = get_build_entries(root_path) + precomplete_file_path = os.path.join(root_path,"precomplete") + # open in binary mode to prevent OS specific line endings. + precomplete_file = open(precomplete_file_path, "wb") + for rel_file_path in rel_file_path_list: + precomplete_file.writelines("remove \""+rel_file_path+"\"\n") + + for rel_dir_path in rel_dir_path_list: + precomplete_file.writelines("rmdir \""+rel_dir_path+"\"\n") + + precomplete_file.close() + +if __name__ == "__main__": + generate_precomplete(os.getcwd())