def initializeGitRepository(self, create=True): gitDir = self.ctx.getGitDir() repoName = self.ctx.getRepositoryName(self.repo) repoDir = '/'.join((gitDir, repoName)) skeleton = self.ctx.getSkeleton(self.repo) if os.path.exists(repoDir): os.chdir(repoDir) else: os.chdir(gitDir) self.clone(self.ctx.getGitRef(self.repo)) os.chdir(repoDir) refs = self.refs() if not refs: if not create: raise RuntimeError('repository %s has not been populated' %self.repo) # master branch needs to exist, so use skeleton or .gitignore if skeleton: skelFiles = util.listFiles(skeleton) util.copyFiles(skeleton, repoDir, skelFiles) else: gitignore = file('/'.join((repoDir, '.gitignore')), 'w') exportDir = self.ctx.getCVSExportDir(self.repo) cvsignoreName = '/'.join((exportDir, '.cvsignore')) if os.path.exists(cvsignoreName): gitignore.write(file(cvsignoreName).read()) gitignore.close() self.addAll() self.commit('create new empty master branch') self.push('origin', 'master', 'master')
def initializeGitRepository(self, create=True): gitDir = self.ctx.getGitDir() repoName = self.ctx.getRepositoryName(self.repo) repoDir = '/'.join((gitDir, repoName)) skeleton = self.ctx.getSkeleton(self.repo) if os.path.exists(repoDir): os.chdir(repoDir) else: os.chdir(gitDir) self.clone(self.ctx.getGitRef(self.repo)) os.chdir(repoDir) refs = self.refs() if not refs: if not create: raise RuntimeError('repository %s has not been populated' % self.repo) # master branch needs to exist, so use skeleton or .gitignore if skeleton: skelFiles = util.listFiles(skeleton) util.copyFiles(skeleton, repoDir, skelFiles) else: gitignore = file('/'.join((repoDir, '.gitignore')), 'w') exportDir = self.ctx.getCVSExportDir(self.repo) cvsignoreName = '/'.join((exportDir, '.cvsignore')) if os.path.exists(cvsignoreName): gitignore.write(file(cvsignoreName).read()) gitignore.close() self.addAll() self.commit('create new empty master branch') self.push('origin', 'master', 'master')
def test_copyFiles(self): util.copyFiles(self.s, self.t, ['/a', '/b', '/dir/metoo']) self.assertTrue(os.path.exists(self.t + '/a')) self.assertTrue(os.path.exists(self.t + '/b')) self.assertTrue(os.path.exists(self.t + '/dir/metoo')) self.assertEqual(file(self.t + '/a').read(), 'a') self.assertEqual(file(self.t + '/b').read(), 'b') self.assertEqual(file(self.t + '/dir/metoo').read(), 'metoo') self.assertMode(self.t + '/dir/metoo', self.weirdMode)
def copyFiles(self, sourceDir, fileNames): "call addFiles for any files being added rather than updated" util.copyFiles(sourceDir, self.path, fileNames)
def importcvs(self, repository, Git, CVS, cvsbranch, gitbranch): gitDir = self.ctx.getGitDir() repoName = self.ctx.getRepositoryName(repository) repoDir = "/".join((gitDir, repoName)) skeleton = self.ctx.getSkeleton(repository) exportDir = self.ctx.getCVSExportDir(repository) if os.path.exists(exportDir): util.removeRecursive(exportDir) os.makedirs(exportDir) os.chdir(os.path.dirname(exportDir)) CVS.export(os.path.basename(exportDir)) cvsignore = ignore.Ignore(Git.log, exportDir + "/.cvsignore") # Awaiting use case requiring partial import into Git before # writing test cases to implement it for import from CVS into Git # bigitrsync = ignore.Ignore(Git.log, gitDir + '/.bigitrsync', regex=True) exportedFiles = util.listFiles(exportDir) if not exportedFiles: raise RuntimeError("CVS branch '%s' for location '%s' contains no files" % (CVS.branch, CVS.location)) # Sync only explicitly requested files # exportedFiles = sorted(list(bigitrsync.include(exportedFiles))) os.chdir(exportDir) Git.initializeGitRepository() os.chdir(repoDir) addSkeleton = False branches = Git.branches() if gitbranch not in branches: if "remotes/origin/" + gitbranch in branches: # check out existing remote branch Git.checkoutTracking(gitbranch) else: # check out a new "orphan" branch Git.checkoutNewImportBranch(gitbranch) addSkeleton = True else: if Git.branch() != gitbranch: Git.checkout(gitbranch) Git.fetch() Git.mergeFastForward("origin/" + gitbranch) # clean up after any garbage left over from previous runs so # that we can change branches Git.pristine() gitFiles = Git.listContentFiles() gitFiles = cvsignore.filter(set(gitFiles)) gitFiles.discard(".bigitrsync") # delete only files matching the sync expressions # gitFiles = sorted(list(bigitrsync.include(gitFiles))) for filename in gitFiles: os.remove(filename) os.chdir(gitDir) util.copyFiles(exportDir, repoDir, exportedFiles) if addSkeleton: if skeleton: skelFiles = util.listFiles(skeleton) util.copyFiles(skeleton, repoDir, skelFiles) os.chdir(repoDir) Git.runImpPreHooks(gitbranch) if Git.status(): # there is some change to commit Git.infoStatus() Git.infoDiff() # store Git.log.lastOutput() to email after successful push Git.addAll() # Git.addAll() will have regularized line ending differences, # and in case that is the only change, we need to check again # on status if Git.status(): # FIXME: try to create a commit message that includes all # the CVS commit messages since the previous commit, de-duplicated Git.commit("import from CVS as of %s" % time.asctime()) Git.push("origin", gitbranch, gitbranch) Git.runImpPostHooks(gitbranch) merger = gitmerge.Merger(self.ctx) merger.mergeFrom(repository, Git, gitbranch)
def copyFiles(self, sourceDir, fileNames): 'call addFiles for any files being added rather than updated' util.copyFiles(sourceDir, self.path, fileNames)
def test_copyFilesEmpty(self): with mock.patch('os.path.exists'): util.copyFiles('/ignore', '/me', []) self.assertFalse(os.path.exists.called)
def importcvs(self, repository, Git, CVS, cvsbranch, gitbranch): gitDir = self.ctx.getGitDir() repoName = self.ctx.getRepositoryName(repository) repoDir = '/'.join((gitDir, repoName)) skeleton = self.ctx.getSkeleton(repository) exportDir = self.ctx.getCVSExportDir(repository) if os.path.exists(exportDir): util.removeRecursive(exportDir) os.makedirs(exportDir) os.chdir(os.path.dirname(exportDir)) CVS.export(os.path.basename(exportDir)) cvsignore = ignore.Ignore(Git.log, exportDir + '/.cvsignore') # Awaiting use case requiring partial import into Git before # writing test cases to implement it for import from CVS into Git # bigitrsync = ignore.Ignore(Git.log, gitDir + '/.bigitrsync', regex=True) exportedFiles = util.listFiles(exportDir) if not exportedFiles: raise RuntimeError("CVS branch '%s' for location '%s' contains no files" %(CVS.branch, CVS.location)) # Sync only explicitly requested files # exportedFiles = sorted(list(bigitrsync.include(exportedFiles))) os.chdir(exportDir) Git.initializeGitRepository() os.chdir(repoDir) addSkeleton = False branches = Git.branches() if gitbranch not in branches: if 'remotes/origin/' + gitbranch in branches: # check out existing remote branch Git.checkoutTracking(gitbranch) else: # check out a new "orphan" branch Git.checkoutNewImportBranch(gitbranch) addSkeleton = True else: if Git.branch() != gitbranch: Git.checkout(gitbranch) Git.fetch() Git.mergeFastForward('origin/' + gitbranch) # clean up after any garbage left over from previous runs so # that we can change branches Git.pristine() gitFiles = Git.listContentFiles() gitFiles = cvsignore.filter(set(gitFiles)) gitFiles.discard('.bigitrsync') # delete only files matching the sync expressions # gitFiles = sorted(list(bigitrsync.include(gitFiles))) for filename in gitFiles: os.remove(filename) os.chdir(gitDir) util.copyFiles(exportDir, repoDir, exportedFiles) if addSkeleton: if skeleton: skelFiles = util.listFiles(skeleton) util.copyFiles(skeleton, repoDir, skelFiles) os.chdir(repoDir) Git.runImpPreHooks(gitbranch) if Git.status(): # there is some change to commit Git.infoStatus() Git.infoDiff() # store Git.log.lastOutput() to email after successful push Git.addAll() # Git.addAll() will have regularized line ending differences, # and in case that is the only change, we need to check again # on status if Git.status(): # FIXME: try to create a commit message that includes all # the CVS commit messages since the previous commit, de-duplicated Git.commit('import from CVS as of %s' %time.asctime()) Git.push('origin', gitbranch, gitbranch) Git.runImpPostHooks(gitbranch) merger = gitmerge.Merger(self.ctx) merger.mergeFrom(repository, Git, gitbranch)