Example #1
0
def dump_changesets(repo):
    """ Print all the changesets in a repo. """
    print "---"
    max_rev = repo['tip'].rev()
    for rev in range(-1, max_rev + 1):
        print hex_version(repo, rev)
    print "---"
Example #2
0
def dump_changesets(repo):
    """ Print all the changesets in a repo. """
    print "---"
    max_rev = repo['tip'].rev()
    for rev in range(-1, max_rev + 1):
        print hex_version(repo, rev)
    print "---"
Example #3
0
    def test_modify_file(self):
        # setup the server repository
        server_repo = self.make_repo('server')
        original_page_bytes = 'This the default front page.\n'
        self.commit_revision(server_repo,
                             (('wiki_root/wikitext/FrontPage',
                               original_page_bytes),),
                             'Initial checkin of server repo.')

        # pull the client repo
        client_repo = self.clone_repo(server_repo, 'client')

        # get a write overlay for the client repo
        overlay = self.get_write_overlay(client_repo)

        page_path = 'wiki_root/wikitext/FrontPage'
        page_bytes = original_page_bytes + 'Client changes.\n'

        # write the updated file into it.
        overlay.write(os.path.join(client_repo.root,
                                   page_path),
                      page_bytes)
        # make a submission bundle
        raw_zip_bytes = self.make_submission_zip(client_repo)

        #(fms_id, usk_hash, base_version, chk, length)
        msg_id = 'fake_msg_id_000'
        submission_tuple = (DEFAULT_SUBMITTER,
                            '000000000000',
                            hex_version(server_repo)[:12],
                            'CHK@fakechk',
                            len(raw_zip_bytes))

        server_overlay = self.get_hg_overlay(server_repo)
        server_overlay.version = hex_version(server_repo) # tip
        server_page_path = os.path.join(server_repo.root, page_path)

        self.assertTrue(server_overlay.exists(server_page_path))
        self.assertTrue(server_overlay.read(server_page_path) ==
                        original_page_bytes)

        # apply the submission bundle to the server repo
        self.get_applier(server_repo).apply_submission(msg_id,
                                                       submission_tuple,
                                                       raw_zip_bytes,
                                                       os.path.join(
                                                           self.tmp_dir,
                                                           '_tmp__applying'))
        self.assertTrue(server_overlay.exists(server_page_path))
        self.assertTrue(server_overlay.read(server_page_path) ==
                        original_page_bytes)

        server_overlay.version = hex_version(server_repo) # new tip
        self.assertTrue(server_overlay.exists(server_page_path))

        # check that the versions are the same
        self.assertTrue(server_overlay.read(server_page_path) ==
                        original_page_bytes + 'Client changes.\n')
Example #4
0
    def fixup_accepted_log(self):
        """ INTERNAL: Hack to fix the hg version int the accepted.txt log. """
        version = hex_version(self.repo)[:12] # The new tip.
        self.logger.debug("fixup_accept_log -- fixing up: %s" % version)
        assert len(version) == len(SENTINEL_VER)

        full_path = os.path.join(self.full_base_path(), 'accepted.txt')
        in_file = open(full_path, 'rb')
        try:
            lines = in_file.readlines()
            in_file.close()
            pos = len(lines) -1
            while pos >= 0:
                if not lines[pos].startswith(SENTINEL_VER):
                    pos -= 1
                    continue
                lines[pos] = version + lines[pos][len(version):]
                break

            assert pos >= 0
            # Replace existing file.
            os.remove(full_path)
            try:
                out_file = open(full_path, 'wb')
                out_file.write("".join(lines))
            finally:
                out_file.close()
        finally:
            in_file.close()
Example #5
0
    def update_change_log(self, msg_id, submission_tuple, result=None,
                          succeeded=False):
        """ Update the accepted.txt or rejected.txt change log
            based on the results of a submission. """
        self.logger.trace("update_change_log:\n%s\n%s\n%s\n%s" %
                          (msg_id, submission_tuple, str(result),
                           str(succeeded)))

        full_path = self.full_base_path()
        if succeeded:
            full_path = os.path.join(full_path, 'accepted.txt')
            out_file = open(full_path, 'ab')
            try:
                out_file.write("%s:%i:%s:%s\n" % ( SENTINEL_VER,
                                                   time.time(),
                                                   submission_tuple[0],
                                                   submission_tuple[3]))
                # Created, modified, removed, skipped, forked
                op_lut = ('C', 'M', 'R', '*', 'F')
                for index, values in enumerate(result):
                    if index == 3 or index > 4:
                        continue # HACK # REDFLAG: change order?
                    if len(values):
                        values = list(values)
                        values.sort()
                        out_file.write("%s:%s\n" % (op_lut[index],
                                                    ':'.join(values)))
            finally:
                out_file.close()
            # Caller is resposible for commiting or setting "needs commit".
            return

        # Failed
        full_path = os.path.join(full_path, 'rejected.txt')
        if result is None:
            result = REJECT_UNKNOWN # ??? just assert?
        out_file = open(full_path, 'ab')
        try:
            out_file.write("%s:%i:%s:%s:%i\n" % (hex_version(self.repo)[:12],
                                                 time.time(),
                                                 submission_tuple[0],
                                                 submission_tuple[3],
                                                 int(result)))
        finally:
            out_file.close()

        self.notify_needs_commit()
Example #6
0
    def start_pushing(self, insert_uri, to_versions=('tip',), request_uri=None,
                      is_keypair=False):

        """ Start pushing local changes up to to_version to an existing
             Infocalypse repository. """

        self.require_state(QUIESCENT)
        self.reset()
        self.ctx.graph = None
        self.ctx['INSERT_URI'] = insert_uri
        self.ctx['REQUEST_URI'] = request_uri
        # Hmmmm... better exception if to_version isn't in the repo?
        self.ctx['TARGET_VERSIONS'] = tuple([hex_version(self.ctx.repo, ver)
                                             for ver in to_versions])
        if request_uri is None:
            self.ctx['IS_KEYPAIR'] = True
            self.transition(INVERTING_URI_4_INSERT)
        else:
            self.ctx['IS_KEYPAIR'] = is_keypair
            self.transition(REQUESTING_URI_4_INSERT)
Example #7
0
    def start_pushing(self,
                      insert_uri,
                      to_versions=('tip', ),
                      request_uri=None,
                      is_keypair=False):
        """ Start pushing local changes up to to_version to an existing
             Infocalypse repository. """

        self.require_state(QUIESCENT)
        self.reset()
        self.ctx.graph = None
        self.ctx['INSERT_URI'] = insert_uri
        self.ctx['REQUEST_URI'] = request_uri
        # Hmmmm... better exception if to_version isn't in the repo?
        self.ctx['TARGET_VERSIONS'] = tuple(
            [hex_version(self.ctx.repo, ver) for ver in to_versions])
        if request_uri is None:
            self.ctx['IS_KEYPAIR'] = True
            self.transition(INVERTING_URI_4_INSERT)
        else:
            self.ctx['IS_KEYPAIR'] = is_keypair
            self.transition(REQUESTING_URI_4_INSERT)
Example #8
0
    def test_remove_file_conflict(self):
        # setup the server repository
        server_repo = self.make_repo('server')
        self.commit_revision(server_repo,
                             (('wiki_root/wikitext/FrontPage',
                               'This the default front page.\n'),),
                             'Initial checkin of server repo.')
        self.commit_revision(server_repo,
                             (('wiki_root/wikitext/FrontPage',
                               'This the updated front page.\n'),),
                             'Second checkin of server repo.')

        # pull the client repo
        client_repo = self.clone_repo(server_repo, 'client', '0')

        # get a write overlay for the client repo
        overlay = self.get_write_overlay(client_repo)

        page_path = 'wiki_root/wikitext/FrontPage'
        page_bytes = ''

        # write a new file into it.
        overlay.write(os.path.join(client_repo.root,
                                   page_path),
                      page_bytes)
        # make a submission bundle
        raw_zip_bytes = self.make_submission_zip(client_repo)

        #(fms_id, usk_hash, base_version, chk, length)
        msg_id = 'fake_msg_id_000'
        submission_tuple = (DEFAULT_SUBMITTER,
                            '000000000000',
                            hex_version(server_repo)[:12],
                            'CHK@fakechk',
                            len(raw_zip_bytes))


        server_overlay = self.get_hg_overlay(server_repo)
        server_overlay.version = hex_version(server_repo, '0')
        server_page_path = os.path.join(server_repo.root, page_path)

        # Check that the target page exists.
        self.assertTrue(server_overlay.exists(server_page_path))

        # apply the submission bundle to the server repo
        self.get_applier(server_repo).apply_submission(msg_id,
                                                       submission_tuple,
                                                       raw_zip_bytes,
                                                       os.path.join(
                                                           self.tmp_dir,
                                                           '_tmp__applying'))
        self.assertTrue(server_overlay.exists(server_page_path))
        server_overlay.version = hex_version(server_repo) # new tip
        self.assertTrue(server_overlay.exists(server_page_path))

        # Check that the head version is the servers.
        self.assertTrue(server_overlay.read(server_page_path) ==
                        'This the updated front page.\n')

        # Check that the forked version was created.
        self.has_forked_version(server_overlay, server_page_path, '')
Example #9
0
 def make_submission_zip(self, repo):
     return bundle_wikitext(self.get_write_overlay(repo),
                            hex_version(repo),
                            DEFAULT_SUBMITTER)
Example #10
0

        # Resolve the final fork in client overlay.
        overlay.write(os.path.join(client_repo.root,
                                   "%s_%s" % (page_path, new_sha(texts[2]).
                                          hexdigest())),
                      '')

        # make a submission bundle w/ all forks resolved.
        raw_zip_bytes = self.make_submission_zip(client_repo)

        #(fms_id, usk_hash, base_version, chk, length)
        msg_id = 'fake_msg_id_000'
        submission_tuple = (DEFAULT_SUBMITTER,
                            '000000000000',
                            hex_version(server_repo)[:12],
                            'CHK@fakechk',
                            len(raw_zip_bytes))


        server_overlay = self.get_hg_overlay(server_repo)
        server_overlay.version = hex_version(server_repo, '0')
        server_page_path = os.path.join(server_repo.root, page_path)

        # Check that the target page exists.
        self.assertTrue(server_overlay.exists(server_page_path))
        self.assertTrue(server_overlay.read(server_page_path) != page_bytes)


        self.assertTrue(overlay.read(os.path.join(client_repo.root,
                                                  page_path)) ==