Rustom Mody | 6 Oct 16:13

bazaar for documents -- facets

Bazaar is used mainly for source code versioning.  I was wondering if
it could also be of use for managing documents.

The differences I see are:
1. A document is likely to be much simpler than a code project  -- 1
single file would be quite natural
2. Sharing history of multiple documents may or may not be meaningful
3. Facets

A facet is like a revision/version but is in a sense orthogonal.  For
example one may want to maintain print and web facets of a document.

Or a salesperson wanting to make a pitch to a customer may wish to
take a ready template for the product and tailor it to a particular
customer.  A close approx to the need for facets in the software dev
world is when a software needs to be packaged for two or more OSes.

The key difference between a facet and a version is that versions are
intended to be merged into a final single product, whereas a facet is
intended to be different from other facets throughout its lifetime.
The key requirement for this is that one needs to be able to commit
into internal (non-tip) branches. ie if I have an original doc O with
two versions for customer Alice and Ben:

   A
  /
O
  \
   B

(Continue reading)

Benjamin Peterson | 4 Oct 19:04

[MERGE] Fix two oversights in _dirstate_helpers_c.pyx

I noticed these when trying to compile it with Cython.

--

-- 
Cheers,
Benjamin Peterson
"There's nothing quite as beautiful as an oboe... except a chicken
stuck in a vacuum cleaner."
Attachment (dirstate-typo.patch): application/octet-stream, 2635 bytes
Thomas Manson | 4 Oct 14:48

CVS to Bazaar using cvsps-import

Hi,
 
I'm trying to convert my cvs repository to bazaar (As I'm curious to try bazaar).
 
I've seen this tool to do so : http://bazaar-vcs.org/CVSPSImport
 
here is the content of my cvs repo :
 
paquerette <at> home:~/temp/cvs/files$ ll
total 32
drwxr-x---  8 paquerette paquerette 4096 2007-12-28 17:47 .
drwxr-xr-x  6 paquerette paquerette 4096 2006-10-22 20:05 ..
drwxr-xr-x  7 paquerette paquerette 4096 2008-10-03 22:29 crf-irp
drwxr-xr-x  7 paquerette paquerette 4096 2008-10-04 02:16 crf-irp-model
drwxr-xr-x 10 paquerette paquerette 4096 2008-10-04 02:15 crf-irp-monitor
drwxr-xr-x  6 paquerette paquerette 4096 2008-10-04 02:16 crf-irp-portail
drwxr-xr-x  3 paquerette paquerette 4096 2006-10-23 00:02 CVSROOT
drwxr-xr-x  4 paquerette paquerette 4096 2006-11-02 22:33 Servers
 
The tool is to be used like this :
 
bzr cvsps-import path/to/cvsroot module output
 
I understand the 2 first parameters, but not the last !
What should I do with the 'output' ?
I would expect that my cvs repo would be imported into bazaar.
What should I do next ?
 
Regards,
Thomas.
 
 
 
 
 
 
Elliot Murphy | 4 Oct 04:42

[MERGE][bzr-git] fix import of versionedfiles in bzr-git


Apologies if this patch should go to a different list, I didn't see any
note on the launchpad project page. Here is a tiny import fix for
bzr-git that allows it to load on my machine.
--
Elliot Murphy | https://launchpad.net/~statik/
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: elliot <at> elliotmurphy.com-20081004023723-carx43s8xdgf1l9z
# target_branch: bzr+ssh://statik <at> bazaar.launchpad.net/%7Ebzr/bzr-\
#   git/trunk/
# testament_sha1: c8fd3016115f953fff02bc6e65aac52ae1a9249e
# timestamp: 2008-10-03 22:37:36 -0400
# base_revision_id: jelmer <at> samba.org-20080910111436-89veglifyh2v9ate
# 
# Begin patch
=== modified file 'repository.py'
--- repository.py	2008-09-01 15:42:59 +0000
+++ repository.py	2008-10-04 02:37:23 +0000
@@ -34,7 +34,7 @@
     )
 from bzrlib.transport import get_transport

-from bzrlib.plugins.git import (
+from bzrlib.plugins.git.foreign import (
     versionedfiles
     )
 from bzrlib.plugins.git.mapping import default_mapping

# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWZRaER8AAV1fgAAQUWP//1IC
lAC//99wUANa86K69eqB3Q0SZJsUAyNMmT1NMjQyaZA0GUmTSemm1QNDygAAAAAkhCmmamoG00jT
QBo0AA9QSVNQemoNqA9QBoBtQ0AAJJAgajJpkyBPVMaCbUYIyNF2Jm9r8jTNUGVjTrKJAckYRGlo
y/KcJu1MM3z6qknylNAQb2D9l7Gpx8JScHxAHkwDjZTFuXbdHvfOGsiQiF6DD8LXdtNR7hIU14i5
fFRqhSll9Xh8wVpxdnh1REVs3eOguAJle54oieaDh4wiJsvCA+RMYaB9c8NUXqU4GgsEZ2iosKpJ
XjTqFig8VQHLVBBIfSYGB4dBTvZCrWqw2ixtKBPJk9ZSFhSVdicKTKuVjQVY8iLZgbi+gVTWiYrM
VBy8BNvLi83avpWmZImXb4lpOb8Sgl69htoUGUYuNdCrMoDxjAsF4iJq2ml1oXxHBS8AsChQjVwk
XzmwgzgzJVVaUER6zMB5/lWZFazFTJn5smNifYVhHuLfyOYXkxjlKrNGzB+9wfl+DorEnKM8Z0rA
i5hmb6b9dLvf9ev26Mq5lbMDOJ9NbyPIGgGwzOR14G4ypUyARYDyarqaLiKlUKixcOBsHEg0HnPJ
pnBpKRF5niU4a6Gl6JV5ZE+ZvNWJNWkk6aNxrs6izPmR6THIMgkYGzvC4Kcs1pAnFFga2AOotI8L
BSR/SLEBUkwHlhXgHbLeGGZFVAUJ2W/IXsaGRvOZxJnxpVsvn6JJWEBRANBLBUi0d2ZXcYyb+qWU
yHAaZRWHADBaY1Nl7opIm4kru04hE4L+hOr75vjegsSVYFAPXfZkPlhmxuLwivMVAQxsVSS0+MRL
Rg5R4eAFSpDvYiGmesxpltIHFJoXMlmSgDxvbo7YDMhlvupbECAHkz0TCXQGWCeJlECbJXVl996g
SCwCx5VrW6qoaSvie3c5FgP5OiLm8q0usZPoCqWD1twhcFwFEhhmNQnCt9RQKhm0OofsxVTWBruU
WLOqInWj5ufa8yaV8G8vm7F2BZZaQMSaDnKRFaRMYd4xdCX9OltVKtKaBhAsj3i6Cckpy49ihKA3
kn3HEtAtVpb2/4u5IpwoSEotCI+A
John Arbash Meinel | 3 Oct 23:17

Releasing a non-dev version of btree repo


I've been doing some index profiling, and I believe that releasing a
repository with the only update being BTree indexes is a significant win.

For testing, I went ahead and created an exact copy of the bzr.dev
repository in people.ubuntu.com/~jameinel, which has similar latency and
bandwidth for me versus the main repository.

I have a snapshot of a repository which I then update to the latest tip.
This is going from 25544 revision to 25552, so only 8 new revisions.

'time bzr up'

time	source
1m10s	pack-0.92
0m15s	development2

or about 4.6 times faster. As another point, the size of the indexes are
9.6MB in bzr.dev but only 4.7MB with btree (and if we enable max
compression, it goes all the way down to 3.7MB).

At 160kB/s (my bandwidth), it takes 24s to download 3.7MB, or 61s to
download the 9.6MB of GI indexes.

This shows a few things... We are likely downloading 90% of GI indices,
because the search is sub-optimal. But we can't be downloading all of
the 4.7MB indexes because that would still be more than 15s.

I've been playing around with changing the logic to "expand" requests
(similar to how we do for GraphIndex calls.) So far, at least for 'bzr
log --short -r X..Y', it is actually better to *not* expand.

Anyway, I think BTreeIndex actually provides a significant benefit all
by itself. So there is no real reason not to release it as a supported
format.

John
=:->
John Arbash Meinel | 3 Oct 18:57

[MERGE] Make 'bzr co' more memory sensitive


At the moment, we've been bringing in some really nice apis, which allow
us to discuss large amounts of data at once. One case is that now "bzr
co" is able to pass the list of all files to checkout into
"iter_files_bytes()", which can then be spooled out in any order.

This is very nice for CPU time, as it doesn't require us to access the
same things over and over again. However, it turns out that it causes us
to unpack the entire WT into memory before we write it out.

This was the cause of:
https://bugs.edge.launchpad.net/bzr/+bug/277171
and
https://bugs.edge.launchpad.net/bzr/+bug/269456

There are several things to be done to combat this, but I'm starting
with this. In testing on a mysql tree, doing "bzr co" with current
bzr.dev uses around 700MB (the tree is 157MB). When I do the same with
my patch, it uses 200MB right away (loading all the relevant text
indexes), and then it stays stable at under 270MB.

It does slow down the time for "bzr co" by a little bit (at least as
long as you aren't hitting swap). My guess is that asking for
everything-at-once is able to order the reads from the pack repository
in more linear order.

The difference isn't huge, though:
real    1m42.557s
vs
real    2m6.050s

A better fix would be to rewrite _get_content_map functionality so that
it can be an iterator, with the ability to hold on to *some*
intermediate results that it will need to produce later results, but
also able to let go of other intermediate results when they are no
longer needed.

Also, I should mention that the code is buffering all of the
intermediate content as well, not just the final texts. Another small
issue is that we have to return the texts as ''.join(lines) rather than
just lines. However, this isn't a huge overhead, as it only doubles the
consumption for each file, and we don't hold on to those strings after
they are written out.

Just to give an outline of memory consumption...

1) get_parent_map(keys) reads all of the text indexes because it is
doing a very broad request of all files on disk. This ends with a peak
memory of 270MB and a resident of 230MB

2) _get_record_map(keys) reads in the raw bytes from disk. This is the
fulltext records plus the delta records. This is the *parsed* records,
and not the raw bytes from disk. So things have been uncompressed and
parsed into lines. At this point, we are at 565MB of RAM

3) _get_content_map(keys) converts the raw fulltexts and deltas into
in-memory lists of lines. Note, however, that it is good about sharing
the raw strings between the lists it creates. So probably most of the
extra memory consumed at this point is just in "list" objects. I'm not
100% sure, though. 733MB

With this patch, we still get (1), but because we request the content
one file at a time, neither (2) or (3) buffer much at a time.

I'll also note that with btree indexes (1) drops to 130MB instead of 230MB.

Also, because of the text sharing, I don't think that doing
"text_map.pop()" ends up saving as much memory as I hoped. The problem
is that it will usually have several texts in the chain, and we are only
removing the last one/two whatever.

I suppose my ideal structure would get the full list of keys that we
actually need to write to disk. It would then lookup in the indexes to
find the ancestry it needs to build those texts. Then sort by pack
location to get optimal read ordering. It would then start reading in
order, buffer what it needs to get to the next text, and then release
the buffers when the final text is extracted.

My updating "bzr pack" to sort the file texts, it can also help give us
upper bounds on the amount of memory we will consume. (Certainly without
disk ordering, the worst case is O(all_texts)).

John
=:->

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: john <at> arbash-meinel.com-20081003161439-h23zdckp4z78wh3r
# target_branch: http://bazaar-vcs.org/bzr/bzr.dev
# testament_sha1: 6ef81e276482005aadd491701ce9fbd46162f25d
# timestamp: 2008-10-03 11:57:11 -0500
# source_branch: http://bzr.arbash-meinel.com/branches/bzr/1.8-\
#   dev/lighter_iter_files_bytes
# base_revision_id: pqm <at> pqm.ubuntu.com-20081002172844-d6df1l8dzpsqzyup
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2008-10-02 17:28:44 +0000
+++ NEWS	2008-10-03 16:14:39 +0000
@@ -83,6 +83,10 @@
       repository now preserves the repository format.
       (Andrew Bennetts, #269214)

+    * ``bzr co`` uses less memory. It used to unpack the entire WT into
+      memory before writing it to disk. This was a little bit faster, but
+      consumed lots of memory. (John Arbash Meinel, #269456)
+
     * ``bzr log`` now accepts a ``--change`` option.
       (Vincent Ladeuil, #248427)

=== modified file 'bzrlib/knit.py'
--- bzrlib/knit.py	2008-10-01 05:40:45 +0000
+++ bzrlib/knit.py	2008-10-03 16:14:39 +0000
@@ -1124,6 +1124,26 @@
             record_map[key] = record, record_details, digest, next
         return record_map

+    def _split_by_prefix(self, keys):
+        """For the given keys, split them up based on their prefix.
+
+        To keep memory pressure somewhat under control, split the
+        requests back into per-file-id requests, otherwise "bzr co"
+        extracts the full tree into memory before writing it to disk.
+        This should be revisited if _get_content_maps() can ever cross
+        file-id boundaries.
+
+        :param keys: An iterable of key tuples
+        :return: A dict of {prefix: [key_list]}
+        """
+        split_by_prefix = {}
+        for key in keys:
+            if len(key) == 1:
+                split_by_prefix.setdefault('', []).append(key)
+            else:
+                split_by_prefix.setdefault(key[0], []).append(key)
+        return split_by_prefix
+
     def get_record_stream(self, keys, ordering, include_delta_closure):
         """Get a stream of records for keys.

@@ -1223,11 +1243,18 @@
         if include_delta_closure:
             # XXX: get_content_maps performs its own index queries; allow state
             # to be passed in.
-            text_map, _ = self._get_content_maps(present_keys,
-                needed_from_fallback - absent_keys)
-            for key in present_keys:
-                yield FulltextContentFactory(key, global_map[key], None,
-                    ''.join(text_map[key]))
+            non_local_keys = needed_from_fallback - absent_keys
+            prefix_split_keys = self._split_by_prefix(present_keys)
+            prefix_split_non_local_keys = self._split_by_prefix(non_local_keys)
+            for prefix, keys in prefix_split_keys.iteritems():
+                non_local = prefix_split_non_local_keys.get(prefix, [])
+                non_local = set(non_local)
+                text_map, _ = self._get_content_maps(keys, non_local)
+                for key in keys:
+                    lines = text_map.pop(key)
+                    text = ''.join(lines)
+                    yield FulltextContentFactory(key, global_map[key], None,
+                                                 text)
         else:
             for source, keys in source_keys:
                 if source is parent_maps[0]:

# Begin bundle
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
jRWfDf/4u5IpwoSDs4cSMA==
Jelmer Vernooij | 3 Oct 02:19

[MERGE] Fix Ftp+GSSAPI with newer version of Python-Kerberos

The attached patch fixes FTP support against the latest
Python-Kerberos (while keeping older ones working). Apparently this
was an unintended API breakage.

Cheers,

Jelmer
Attachment (bzr-dev-3764.patch): text/x-diff, 3152 bytes
Marius Kruger | 3 Oct 01:39

Re: [shell_hooks/MERGE] make it possible to set the shell hooks globally.

2008/10/1 Jelmer Vernooij <jelmer <at> samba.org>
Hi Marius,

On Fri, 2008-09-12 at 16:18 +0200, Marius Kruger wrote:
>
>
> 2008/9/12 Jelmer Vernooij <jelmer <at> samba.org>
>         Am Freitag, den 12.09.2008, 00:53 +0200 schrieb Marius Kruger:
>         > hi,
>         > another small patch which makes it possible to set the shell
>         hooks
>         > globally.
>         > I dont know what the performance impact of this will be, but
>         I really
>         > need this feature,
>         > so hope youre ok with it.
>
>         This merge request doesn't work for me - it seems to depend on
>         a
>         revision I don't have. I've merged the other patch.
>
> sorry for that, I actually wrote that on the same branch as the other
> patch,
> so since you merged the other one, this one should work fine.
>
> I thought that if its an issue for you I can convert it for you.
>
> BTW, will it also be ok with you if I add support for locations.conf?
In that case, any reason for not using Branch.get_config() ? That will
automatically take care of reading all those three locations under the
hood.

1) I didn't know about it.
2) It doesn't accept the options in the [hooks] section, so we would still need
    to check for that if you'd like to be backwards compatible.

Another thing I figured out while testing if youre solution would work,
is that behind a smart server, locations.conf does not work like (I) expected:
it tries to match urls like: chroot--1211723252:///bazaartest/b/
in stead of /var/lib/gforge/bzrroot/bazaartest/b/
So location based conf does not seem to be a option when running
behind a smart server (bzr+http://)  ATM.
(This might be fixable after https://bugs.launchpad.net/bugs/270267 is fixed)

--
regards
Marius
<><
http://amanica.blogspot.com/
John Arbash Meinel | 3 Oct 00:15

[MERGE/RFC] A bit more info for 'lsprof' about index action


This is a rather trivial patch that just introduces a couple of local
functions.

This is a little useful when trying to debug where the time goes during
index operations. All it really does is separate the time spent because
of "buffering because I read the whole file already" from "buffering
because I've read more than 1/2 the file, and I'm going to be reading
even more.".

We can decide to accept it or not. It has been a little bit of help, but
I think the future lies in BTreeIndex anyway.

John
=:->

=== modified file 'bzrlib/index.py'
--- bzrlib/index.py     2008-09-21 14:48:37 +0000
+++ bzrlib/index.py     2008-10-02 22:14:23 +0000
@@ -1060,7 +1060,9 @@
         if self._nodes is None and self._bytes_read * 2 >= self._size:
             # We've already read more than 50% of the file and we are
about to
             # request more data, just _buffer_all() and be done
           self._buffer_all()
+            def too_much_data_read():
+                self._buffer_all()
+            too_much_data_read()
             return

         readv_data = self._transport.readv(self._name, readv_ranges, True,
@@ -1072,7 +1074,9 @@
                 # We read the whole range, most likely because the
                 # Transport upcast our readv ranges into one long request
                 # for enough total data to grab the whole index.
               self._buffer_all(StringIO(data))
+                def readv_all_data():
+                    self._buffer_all(StringIO(data))
+                readv_all_data()
                 return
             if self._bisect_nodes is None:
                 # this must be the start
Vincent Broman | 3 Oct 00:02

how do I commit somewhere other than onto a tip?

I think I need the capability to commit versions that are not
successors of a tip revision, e.g. I want to commit a new version
which should be placed in between two successive versions already committed,
or else to place it ahead of all the other versions, as a new version 1.
It might even be a new branch off some parent version in the past.

Why? I have inherited a piece of software to maintain for which I
have found many tens of copies of the source in various stages of development,
stored in separate directory trees on various machines or backups.
From file modtimes and from looking at diffs, I have an
approximate idea of the order they should appear in history.
I would like to get everything into a version control system, to document it,
but I cannot just start with the earliest and try to retrace everything
from the big bang to the present in order.

As I go through I may change my mind as to the dependencies/order.
I may find an additional version on a dusty backup after I have started. 
I may only have time to process the last 10-15 versions right now, 
then add in the other older versions as I have time to analyze them later.

My basic problem is recording history retrospectively, instead of
as it happens.  Is this possible in Bazaar?
I do not like the idea of writing code to do surgery on archives
in ways they were not designed to allow, but concatenating dump files
is something subversion sort-of allows.

Vincent Broman
SpaWar Systems Center - Pacific

_readdir_pyx extension cannot be compiled with MSVC

building 'bzrlib._readdir_pyx' extension
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\cl.exe /c /nologo /Ox /MD /W3 /GX /DNDEBUG 
-IC:\Python\2.5.1\include -IC:\Python\2.5.1\PC /Tcbzrlib/_readdir_pyx.c 
/Fobuild\temp.win32-2.5\Release\bzrlib/_readdir_pyx.obj
_readdir_pyx.c
bzrlib\_readdir_pyx.c(32) : fatal error C1083: Cannot open include file: 'dirent.h': No such file or directory
Building of "bzrlib._readdir_pyx" extension failed, will use the Python version instead


Gmane