def _check_hashes (hashes, remote_repo, remote_password):

    host, port, path = parse_URL(remote_repo)

    hashtext = string.join(hashes, "\n")

    # create zipfile of the folder
    errcode, errmsg, headers, text = https_post_multipart(host, port, remote_password,
                                                          "/action/SynchronizeRepositories/check_hashes",
                                                          [("hashes", hashtext),],
                                                          ())
    if errcode != 200:
        note("Errcode %s received.  Error text from repository was\n%s.\n", errcode, errmsg)
        return None

    else:
        results = []
        resultsA = text.split("\n")
        for result in resultsA:
            rr = string.strip(result)
            if rr:
                results.append(string.split(rr))
        return results
def _push_doc (doc, remote_repo_url, remote_password):

    note(3, "pushing %s  (%s)...", doc.id, doc.get_metadata("title"))
    tdir = tempfile.mktemp()
    os.mkdir(tdir)
    try:
        if os.path.isdir(os.path.join(doc.folder(), "page-images")):
            shutil.copytree(os.path.join(doc.folder(), "page-images"), os.path.join(tdir, "page-images"))
        else:
            shutil.copyfile(os.path.join(doc.folder(), "document.tiff"), os.path.join(tdir, "document.tiff"))
        if os.path.exists(doc.text_path()):
            shutil.copyfile(os.path.join(doc.folder(), "contents.txt"), os.path.join(tdir, "contents.txt"))
        if os.path.exists(os.path.join(doc.folder(), "paragraphs.txt")):
            shutil.copyfile(os.path.join(doc.folder(), "paragraphs.txt"), os.path.join(tdir, "paragraphs.txt"))
        if os.path.exists(os.path.join(doc.folder(), "wordbboxes")):
            shutil.copyfile(os.path.join(doc.folder(), "wordbboxes"), os.path.join(tdir, "wordbboxes"))
        if os.path.exists(os.path.join(doc.folder(), "images")):
            shutil.copytree(os.path.join(doc.folder(), "images"), os.path.join(tdir, "images"))
        if os.path.exists(os.path.join(doc.folder(), "originals")):
            shutil.copytree(os.path.join(doc.folder(), "originals"), os.path.join(tdir, "originals"))
        if os.path.exists(os.path.join(doc.folder(), "links")):
            shutil.copytree(os.path.join(doc.folder(), "links"), os.path.join(tdir, "links"))

        # filter the metadata
        conf = configurator()
        md = doc.get_metadata()
        newmd = {}
        properties = string.split(conf.get('synchronizing-properties') or
                                  conf.get('metadata-sharing-properties') or
                                  conf.get('metadata-sharing-default-properties'), ':')

        for property in ["title", "date", "authors", "citation"]:
            if not property in properties:
                properties.append(property)

        for prop in properties:
            if md.has_key(prop):
                newmd[prop] = md[prop]
        update_metadata(os.path.join(tdir, "metadata.txt"), newmd)

        host, port, path = parse_URL(remote_repo_url)

        # create zipfile of the folder
        tmpfilename = zipup(tdir)
        try:
            # send it to the repository
            errcode, errmsg, headers, text = https_post_multipart(host, port, remote_password,
                                                                  "/action/basic/repo_add",
                                                                  (("password", remote_password,),
                                                                   ("filetype", "zipped-folder",)),
                                                                  (("newfile", tmpfilename),))
            if errcode != 200:
                raise ValueError("Posting of data to repository %s resulted in error %d (%s).\nReturned text was:\n%s" % (remote_repo_url, errcode, errmsg, text))
            note(3, "text from remote repository was\n%s.\n", text)
            note(3, "%s successfully posted to %s.", tdir, remote_repo_url)

        finally:
            if os.path.exists(tmpfilename):
                os.unlink(tmpfilename)

        return text.strip()

    finally:
        if os.path.exists(tdir):
            shutil.rmtree(tdir)
def _pull_doc (local_repo, doc_id, remote_repo_url, remote_password):
    host, port, path = parse_URL(remote_repo_url)
    return _get_doc_to_file(local_repo, host, port, remote_password, '/action/externalAPI/fetch_folder?doc_id=%s' % doc_id)