def merge_wikitext(ui_, repo, base_dir, tmp_file, in_stream): """ Merge changes from a submission zip file into the repository. """ # HgFileOverlay to read bundle files with. prev_overlay = HgFileOverlay(ui_, repo, base_dir, tmp_file) # Direct overlay to write updates into the repo. head_overlay = DirectFiles(os.path.join(repo.root, base_dir)) arch = ZipFile(in_stream, 'r') try: base_ver, dummy = unpack_info(arch.read('__INFO__')) if not has_version(repo, base_ver): # REDFLAG: Think. What about 000000000000? # It is always legal. hmmmm... raise SubmitError("Base version: %s not in repository." % base_ver[:12], True) # Still need to check for illegal submissions. prev_overlay.version = base_ver # REDFLAG: revisit. # just assert in forking_extract_wikitext and # get rid of extra checking / exception raising? check_base_shas(arch, prev_overlay) # Hmmmm... checking against a version of readonly.txt # which may be later than the one that the submitter # used. check_writable(head_overlay, arch) check_merges([name for name in arch.namelist() if name != '__INFO__'], # pylint gives spurious E1101 here ??? #pylint: disable-msg=E1101 prev_overlay.list_pages(os.path.join(prev_overlay. base_path, 'wikitext')), ArchiveHasher(arch).hexdigest) # created, modified, removed, skipped, forked op_lut = (set([]), set([]), set([]), set([]), set([])) for name in arch.namelist(): # check_base_sha validates wikinames. if name == "__INFO__": continue action, versioned_name = forking_extract_wikitext(arch, prev_overlay, head_overlay, name) op_lut[action].add(versioned_name) return op_lut finally: arch.close()