--- sccs2svn.py.stock 2006-02-19 13:05:08.000000000 -0500 +++ sccs2svn.py 2012-10-14 15:19:25.000000000 -0400 @@ -137,7 +137,7 @@ """ Our interface to subversion """ def __init__(self, repositoryPath, pool): - self.context = client.svn_client_ctx_t() + self.context = client.svn_client_create_context() configDirectory = core.svn_config_ensure( '', pool) self.context.config = core.svn_config_get_config(configDirectory, pool) self.pool = pool @@ -147,8 +147,9 @@ self.addedDirectories = {} self.addedDirectories["/"] = 1 - def _commit(self, rev, date, txn, subpool): + def _commit(self, date, txn, subpool): """ Commit the supplied transaction to Subversion. """ + rev = repos.svn_repos_fs_commit_txn(self.repos_ptr, txn, subpool) fs.change_rev_prop(self.fsob, rev, core.SVN_PROP_ENTRY_COMMITTED_DATE, date, subpool) @@ -157,17 +158,21 @@ core.SVN_PROP_REVISION_DATE, date, subpool) - return repos.svn_repos_fs_commit_txn(self.repos_ptr, txn, subpool) + return rev def _revisionSetup(self, subpool, author, message): """ All of the setup for performing a revision. """ revision = fs.youngest_rev(self.fsob, subpool) + message = message.replace('\r\n', '\n') + message = message.replace('\r', '\n') + if options.encoding: + message = message.decode(options.encoding, 'replace').encode('utf-8', 'replace') transaction = repos.svn_repos_fs_begin_txn_for_commit(self.repos_ptr, revision, author, message, subpool) root = fs.txn_root(transaction, subpool) - return (revision, transaction, root) + return (transaction, root) def _directoriesToAdd(self, delta): """ Return a list of directories to add for delta. """ @@ -185,7 +190,7 @@ if len(directoriesToAdd) == 0: return subpool = core.svn_pool_create(self.pool) - (revision, transaction, root) = \ + (transaction, root) = \ self._revisionSetup(subpool, options.userid, "Automatic directory addition") @@ -195,7 +200,7 @@ fs.make_dir(root, directory, subpool) self.addedDirectories[directory] = 1 - self._commit(revision, delta.getDate(), transaction, subpool) + self._commit(delta.getDate(), transaction, subpool) core.svn_pool_destroy(subpool) def add(self, deltas): @@ -217,7 +222,7 @@ self._addDirectories(delta) subpool = core.svn_pool_create(self.pool) - (revision, transaction, root) = self._revisionSetup(subpool, + (transaction, root) = self._revisionSetup(subpool, new_deltas[0].author, new_deltas[0].comment) @@ -236,21 +241,20 @@ print "sending ", subversionPath, delta.getDate() print "committing version ", - print self._commit(revision, delta.getDate(), transaction, subpool) + print self._commit(delta.getDate(), transaction, subpool) core.svn_pool_destroy(subpool) def remove(self, filenames): """ Remove the supplied filenames file from the repository. """ subpool = core.svn_pool_create(self.pool) - (revision, - transaction, + (transaction, root) = self._revisionSetup(subpool, options.userid, "Automated SCCS conversion removal") for file in filenames: print "removing ", file fs.delete(root, file, subpool) - self._commit(revision, subversionTime(time.localtime()), + self._commit(subversionTime(time.localtime()), transaction, subpool) core.svn_pool_destroy(subpool) @@ -268,8 +272,7 @@ """ Set the keywords property for the supplied filenames. """ subpool = core.svn_pool_create(self.pool) - (revision, - transaction, + (transaction, root) = self._revisionSetup(subpool, options.userid, "Automated property set") @@ -287,7 +290,7 @@ else: print "skipping property set for ", filename - self._commit(revision, subversionTime(time.localtime()), + self._commit(subversionTime(time.localtime()), transaction, subpool) core.svn_pool_destroy(subpool) @@ -306,8 +309,7 @@ """ Convert the SCCS keywords inside of the supplied deltas to subversion keywords. """ subpool = core.svn_pool_create(self.pool) - (revision, - transaction, + (transaction, root) = self._revisionSetup(subpool, options.userid, "Automated keyword replacement") @@ -324,7 +326,7 @@ print "sending ", delta.getRepositoryName() print "committing version ", - print self._commit(revision, delta.getDate(), transaction, subpool) + print self._commit(delta.getDate(), transaction, subpool) core.svn_pool_destroy(subpool) @@ -410,8 +412,9 @@ filenames[i.getRepositoryName()] = i # Update their properties and keywords. - interface.propertyUpdate(filenames.keys()) - interface.idKeyUpdate(filenames.values()) + if not options.pure: + interface.propertyUpdate(filenames.keys()) + interface.idKeyUpdate(filenames.values()) # Delete any file ending in '-' #versionsToDelete = {} @@ -438,6 +441,12 @@ parser.add_option("-i", "--sccs-repository", dest="sccs_repository", metavar="sccs root directory", help="The location of the SCCS repository") + parser.add_option("-e", "--encoding", dest="encoding", + metavar="original_encoding", + help="Encoding used in log messages, eg: iso-8859-1; default: no conversion (must be utf-8 valid)") + parser.add_option("-p", "--pure", dest="pure", + action="store_true", default=False, + help="Don't apply post-conversion keyword and property fixups.") (options, args) = parser.parse_args()