def testFileChanges(self): (built, d) = self.buildRecipe(recipes.testRecipe1, "TestRecipe1") (name, version, flavor) = built[0] version = versions.VersionFromString(version) (fd, path) = tempfile.mkstemp() os.close(fd) repos = self.openRepository() repos.createChangeSetFile( [(name, (None, None), (version, flavor), 1)], path) infc = filecontainer.FileContainer(open(path)) os.unlink(path) (fd, path) = tempfile.mkstemp() os.close(fd) outfc = filecontainer.FileContainer(open(path, "w")) n = 0 while True: next = infc.getNextFile() if not next: break (name, tag, f) = next n += 1 if n == 2 or n == 5: # modify the file a bit contents = gzip.GzipFile(None, "r", fileobj = f).read() contents = chr(ord(contents[0]) ^ 0xff) + contents[1:] outfc.addFile(name, filecontents.FromString(contents), tag) else: contents = filecontents.FromFile(f) outfc.addFile(name, filecontents.FromFile(f), tag, precompressed=True) infc.close() outfc.close() self.resetRepository() repos = self.openRepository() try: self.assertRaises(errors.IntegrityError, self.updatePkg, self.rootDir, path) self.assertRaises(errors.IntegrityError, repos.commitChangeSetFile, path) finally: os.unlink(path)
def getFileContents(self, repos, fileList, callback=None): contents = [] needed = [] for idx, item in enumerate(fileList): fileId, fileVersion = item[0:2] fileHash = str(self.hashFile(fileId, fileVersion)) if self.store.hasFile(fileHash): f = self.store.openFile(fileHash) content = filecontents.FromFile(f) contents.append(content) else: contents.append(None) needed.append((idx, (fileId, fileVersion), fileHash)) total = len(needed) newContents = repos.getFileContents([x[1] for x in needed], callback=callback) itemList = itertools.izip(newContents, needed) for content, (idx, (fileId, fileVersion), fileHash) in itemList: if not self.readOnly: self.store.addFile(content.get(), fileHash, integrityCheck=False) contents[idx] = content return contents
def commitChangeSet(self, cs, mirror=False, hidden=False, serialize=False, callback=None, statusPath = None): # let's make sure commiting this change set is a sane thing to attempt for trvCs in cs.iterNewTroveList(): v = trvCs.getNewVersion() if v.isOnLocalHost(): label = v.branch().label() raise errors.CommitError('can not commit items on ' '%s label' %(label.asString())) if self.requireSigs: threshold = openpgpfile.TRUST_FULL else: threshold = openpgpfile.TRUST_UNTRUSTED # Callback for signature verification and progress if statusPath: assert not callback callback = UpdateCallback(statusPath=statusPath, trustThreshold=threshold, keyCache=self.troveStore.keyTable.keyCache) # Restore contents first, before any shared database resources get # locked. preRestored = set() for sha1, fobj in cs.iterRegularFileContents(): cont = filecontents.FromFile(fobj, compressed=True) self._storeFileFromContents(cont, sha1, restoreContents=True, precompressed=True) preRestored.add(sha1) cs.reset() self.troveStore.begin(serialize) try: # reset time stamps only if we're not mirroring. FilesystemChangeSetJob(self, cs, self.serverNameList, resetTimestamps = not mirror, callback=callback, mirror = mirror, hidden = hidden, requireSigs = self.requireSigs, preRestored=preRestored, ) except (openpgpfile.KeyNotFound, errors.DigitalSignatureVerificationError): # don't be quite so noisy, this is a common error self.troveStore.rollback() raise except: print >> sys.stderr, "exception occurred while committing change set" print >> sys.stderr, ''.join(traceback.format_exception(*sys.exc_info())) print >> sys.stderr, "attempting rollback" self.troveStore.rollback() raise else: if self.paranoidCommits: for trvCs in cs.iterNewTroveList(): newTuple = trvCs.getNewNameVersionFlavor() if newTuple[1] is None: continue trv = self.getTrove(withFiles = True, *newTuple) assert(trv.verifyDigests()) self.troveStore.commit()
def __init__(self, **kwargs): _File.__init__(self, **kwargs) if isinstance(self.contents, str): self.contents = filecontents.FromString(self.contents) else: self.contents = filecontents.FromFile(self.contents) self._enforceMutuallyExclusiveFlags()
def testReset(self): class UncloseableFile(StringIO.StringIO): def close(self): assert(0) # Make sure writing a changeset doesn't close the filecontent objects # inside of it. otherCs = changeset.ChangeSet() otherCs.addFileContents("0pathId", "0fileId", changeset.ChangedFileTypes.file, filecontents.FromFile(UncloseableFile("foo")), 1) otherCs.addFileContents("1pathId", "1fileId", changeset.ChangedFileTypes.file, filecontents.FromFile(UncloseableFile("foo")), 0) otherCs.writeToFile(self.workDir + "/test1.ccs") cs = changeset.ReadOnlyChangeSet() cs.merge(otherCs) cs.writeToFile(self.workDir + "/test2.ccs") assert(open(self.workDir + "/test1.ccs").read() == (open(self.workDir + "/test2.ccs").read())) cs.reset() cs.writeToFile(self.workDir + "/test3.ccs") assert(open(self.workDir + "/test1.ccs").read() == (open(self.workDir + "/test3.ccs").read())) otherCs = changeset.ChangeSetFromFile(self.workDir + "/test1.ccs") cs1 = changeset.ReadOnlyChangeSet() cs1.merge(otherCs) otherCs.reset() cs2 = changeset.ReadOnlyChangeSet() cs2.merge(otherCs) assert([ x[0] for x in cs1.fileQueue ] == [ x[0] for x in cs2.fileQueue ]) assert(cs1.configCache == cs2.configCache)
def getFileContentsObjects(self, server, fileList, callback, outF, compressed): if not isinstance(self.c[server], ShimServerProxy): return netclient.NetworkRepositoryClient.getFileContentsObjects( self, server, fileList, callback, outF, compressed) filePaths = self.c[server].getFileContents(fileList) fileObjList = [] for path in filePaths: if compressed: fileObjList.append( filecontents.FromFilesystem(path, compressed = True)) else: f = gzip.GzipFile(path, "r") fileObjList.append(filecontents.FromFile(f)) return fileObjList
def getFileContentsFromTrove(self, n, v, f, pathList, callback = None, compressed = False): server = v.trailingLabel().getHost() if not isinstance(self.c[server], ShimServerProxy): return netclient.NetworkRepositoryClient.getFileContentsFromTrove( self, n, v, f, pathList, callback = callback, compressed = compressed) pathList = [self.fromPath(x) for x in pathList] v = self.fromVersion(v) f = self.fromFlavor(f) filePaths = self.c[server].getFileContentsFromTrove(n,v,f, pathList) fileObjList = [] for path in filePaths: if compressed: fileObjList.append( filecontents.FromFilesystem(path, compressed = True)) else: f = gzip.GzipFile(path, "r") fileObjList.append(filecontents.FromFile(f)) return fileObjList
def test07_BadRpmCapsule(self): cmp = self.addRPMComponent("ghost:rpm=1.0", 'epoch-1.0-1.i386.rpm') repos = self.openRepository() orig = self.workDir + '/ghost.ccs' modified = self.workDir + '/ghost-new.ccs' repos.createChangeSetFile([ (cmp.getName(), (None, None), cmp.getNameVersionFlavor()[1:], True) ], orig) fc = filecontainer.FileContainer( util.ExtendedFile(orig, buffering = False)) newFc = filecontainer.FileContainer( util.ExtendedFile(modified, "w", buffering = False)) # CONARYCHANGESET (name, tag, contents) = fc.getNextFile() newFc.addFile(name, filecontents.FromFile(contents), tag, precompressed = True) # the RPM (name, tag, contents) = fc.getNextFile() contents = filecontents.FromString("busted!") newFc.addFile(name, contents, tag) cs = changeset.ChangeSetFromFile(modified) # this throws away the output about the install failing self.assertRaises(files.Sha1Exception, self.captureOutput, self.updatePkg, self.rootDir, cs)