[PATCH 3 of 5] transaction: add a file generation mechanism

Gregory Szorc gregory.szorc at gmail.com
Thu Aug 7 23:06:00 UTC 2014


Nice. I wonder if we can hook tags or branch caches up to this to make 
the various performance issues with their invalidation go away...

On 8/7/14 3:52 PM, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1407447602 25200
> #      Thu Aug 07 14:40:02 2014 -0700
> # Node ID db950150e34324daa2985b2f51ddc8d0ef6b4705
> # Parent  4470369895a36e9603de8850335df283e664394c
> transaction: add a file generation mechanism
>
> A new `transaction.addfilegenerator` function is added. It allow external code
> to register file to be generated. See inline documentation for details.
>
> It is important to gather all file creations logic on the transaction as at
> some point we'll want to mimic the "pre-transaction-commit" logic that we use
> for revlog. I'm refering to the logic that lets hooks see the result of the transaction before
> it gets actually committed.
>
> diff --git a/mercurial/transaction.py b/mercurial/transaction.py
> --- a/mercurial/transaction.py
> +++ b/mercurial/transaction.py
> @@ -94,10 +94,13 @@ class transaction(object):
>           self.backupsfile = opener.open(self.backupjournal, 'w')
>           if createmode is not None:
>               opener.chmod(self.journal, createmode & 0666)
>               opener.chmod(self.backupjournal, createmode & 0666)
>
> +        # hold file generations to be performed on commit
> +        self._filegenerators = {}
> +
>       def __del__(self):
>           if self.journal:
>               self._abort()
>
>       @active
> @@ -171,10 +174,32 @@ class transaction(object):
>           self.backupmap[file] = len(self.backupentries) - 1
>           self.backupsfile.write("%s\0%s\0" % (file, backupfile))
>           self.backupsfile.flush()
>
>       @active
> +    def addfilegenerator(self, genid, filenames, genfunc, order=0):
> +        """add a function to generates some files at transaction commit
> +
> +        The `genfunc` argument is a function capable of generating proper
> +        content of each entry in the `filename` tuple.
> +
> +        At transaction close time, `genfunc` will be called with one file
> +        object argument per entries in `filenames`.
> +
> +        The transaction itself is responsible for the backup, creation and
> +        final write of such file.
> +
> +        The `genid` argument is used to ensure the same set of file is only
> +        generated once. Call to `addfilegenerator` for a `genid` already
> +        present will overwrite the old entry.
> +
> +        The `order` argument may be used to control the order in which multiple
> +        generator will be executed.
> +        """
> +        self._filegenerators[genid] = (order, filenames, genfunc)
> +
> +    @active
>       def find(self, file):
>           if file in self.map:
>               return self.entries[self.map[file]]
>           if file in self.backupmap:
>               return self.backupentries[self.backupmap[file]]
> @@ -211,10 +236,22 @@ class transaction(object):
>           return self.count > 0
>
>       @active
>       def close(self):
>           '''commit the transaction'''
> +        # write files registered for generation
> +        for order, filenames, genfunc in sorted(self._filegenerators.values()):
> +            files = []
> +            try:
> +                for name in filenames:
> +                    self.addbackup(name)
> +                    files.append(self.opener(name, 'w', atomictemp=True))
> +                genfunc(*files)
> +            finally:
> +                for f in files:
> +                    f.close()
> +
>           if self.count == 1 and self.onclose is not None:
>               self.onclose()
>
>           self.count -= 1
>           if self.count != 0:
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>




More information about the Mercurial-devel mailing list