def _createHard(self, idRev, openedconn): self._logger.debug ( 'Doing a hard revision on %s', str(idRev) ) deltaList = self._getDeltasSinceEvent ('hardexist', 1, idRev) self._logger.debug ( "received this deltaList: %s", repr(deltaList) ) if type(deltaList) == int: self._seterrormsg( 'Could not create internal chain of deltas. '+ 'Internal error: ' + str(deltaList) ) return ERR_INTERNAL # join everything # first throw away this, but save for later hardRev = deltaList.pop() self._logger.debug ( "Generating internal delta" ) try: listoffiles = [os.path.join(self._deltasdir, str(i)) for i in deltaList] delta = Deltas.multiOpen(listoffiles) except: return ERR_FS # the last one, now will have hardcopy openedconn.execute ( '''update revisions set hardexist=1 where idrev=?''' , (idRev,) ) infile = os.path.join(self._hardsdir,str(hardRev)) outfile = os.path.join(self._hardsdir,str(idRev)) delta.patch(infile, outfile) return 0
def GetDelta(self, idRev, idFromRev): ''' Get a delta (see rsync algorithm) from the server to jump to a newer revision. The delta is known to the server or fabricated from some deltas @param idRev: "Destination revision" @param irFromRev: "Origin revision" @return: Binary information of the petition (asked delta) ''' with self._conn as c: # First, check permissions row = c.execute ("select idfile from revisions where idrev=?", (idFromRev,) ).fetchone() if not row: self._seterrormsg("Unknown origin revision") return ERR_NOTEXIST row = c.execute ("select path,isfolder from files where idfile=?", (row['idfile'],) ) if not row: self._seterrormsg('Unconsistent files table (database error)') return ERR_INTERNAL if row['isfolder']: self._seterrormsg('Cannot get a delta for a folder') return ERR_CANNOT originpath = row['path'] ret = self._checkPerms(originpath, auth.READ) if ret < 0: return ret # Until now everything seems fine, let's check "destination" revRow = c.execute( "select * from revisions where idrev=?" , (idRev,) ).fetchone() if not revRow: self._seterrormsg('Unknown destination revision') return ERR_NOTEXIST row = c.execute ("select path,isfolder from files where idfile=?" , (revRow['idfile']) ).fetchone() if not row: self._seterrormsg('Inconsistent files table (database error)') return ERR_INTERNAL if row['isfolder']: self._seterrormsg('Cannot get a delta for a folder') return ERR_CANNOT # only check permissions if there is a folder change if originpath != row['path']: ret = self._checkperms(row['path'], auth.READ) if ret < 0: return ret #if it's the easy way, we do it the easy way (most likely to hapen) if (revRow['fromrev'] == idFromRev) and (revRow['fromtype'] == REV_MODIFIED): #yes, we are lucky! try: return Deltas.open(os.path.join(self._deltasdir,str(idRev))).getXMLRPCBinary() except: return ERR_FS else: # 1st: check that exists a chain of non-deletions between # this two revisions (save the first hardcopy for later) deltaList = self._getDeltasSinceEvent ( 'fromrev' , idFromRev , idRev ) if type(deltaList) == int: return deltaList # 2nd: try to join everything try: listoffiles = [os.path.join(self._deltasdir, str(i)) for i in deltaList] delta = Deltas.multiOpen(listoffiles) except: return ERR_FS # 3rd: Send delta return delta.getXMLRPCBinary()