def cherryPickChange(self): """Cherry-pick a change from the Melange trunk""" rev = io.getNumber('Revision number to cherry-pick:') bug = io.getNumber('Issue fixed by this change:') diff = subversion.diff(self.upstream_repos + '/trunk', rev) if not diff.strip(): raise error.ExpectationFailed( 'Retrieved diff is empty. ' 'Did you accidentally cherry-pick a branch change?') util.run(['patch', '-p0'], cwd=self.wc.path(self.branch_dir), stdin=diff) self.wc.addRemove(self.branch_dir) yaml_path = self.wc.path(self._branchPath('app/app.yaml')) out = [] updated_patchlevel = False for line in io.fileToLines(yaml_path): if line.strip().startswith('version: '): version = line.strip().split()[-1] base, patch = line.rsplit('g', 1) new_version = '%sg%d' % (base, int(patch) + 1) message = ('Cherry-picked r%d from /p/soc/ to fix issue %d' % (rev, bug)) out.append('version: ' + new_version) out.append('# * ' + message) updated_patchlevel = True else: out.append(line) if not updated_patchlevel: log.error('Failed to update Google patch revision') log.error('Cherry-picking failed') io.linesToFile(yaml_path, out) log.info('Check the diff about to be committed with:') log.info('svn diff ' + self.wc.path(self.branch_dir)) if not io.confirm('Commit this change?'): raise error.AbortedByUser('Cherry-pick aborted') self.wc.commit(message) log.info('Cherry-picked r%d from the Melange trunk.' % rev)
def importTag(self): """Import a new Melange release""" release = io.getString('Enter the Melange release to import:') if not release: error.AbortedByUser('No release provided, import aborted') branch_dir = 'branches/' + release if self.wc.exists(branch_dir): raise ObstructionError('Release %s already imported' % release) tag_url = '%s/tags/%s' % (self.upstream_repos, release) release_rev = subversion.find_tag_rev(tag_url) if io.confirm('Confirm import of release %s, tagged at r%d?' % (release, release_rev)): # Add an entry to the vendor externals for the Melange # release. externals = self.wc.propget('svn:externals', 'vendor/soc') externals.append('%s -r %d %s' % (release, release_rev, tag_url)) self.wc.propset('svn:externals', '\n'.join(externals), 'vendor/soc') self.wc.commit('Add svn:externals entry to pull in Melange ' 'release %s at r%d.' % (release, release_rev)) # Export the tag into the release repository's branches subversion.export(tag_url, release_rev, self.wc.path(branch_dir)) # Add and commit the branch add (very long operation!) self.wc.add([branch_dir]) self.wc.commit('Branch of Melange release %s' % release, branch_dir) self._switchBranch(release) # Commit the production GSoC configuration and # google-specific patches. self._addAppYaml() self._applyGooglePatches() # All done! log.info('Melange release %s imported and googlified' % self.branch)