monotone

monotone Commit Details

Date:2010-02-20 15:43:46 (9 years 3 months ago)
Author:Tony Cooper
Branch:net.venge.monotone.contrib.lib.automate-stdio
Commit:916aeca127414e9d621639dd36d04634758ebecc
Parents: 7b4eaad7e76e96ca10c8dbf3774404028a7caf8a
Message:- Now switched over to using randomly generated keys for the Inside-Out style

class. This has meant I can get rid of the CLONE() method and the
%class_objects hash.
- The delete() calls in the destructor are now under the protection of an eval
block (shouldn't have been an issue as deleting a non-existent entry is not an
error but better safe than sorry).
- Stopped using abbreviated words in error messages.
- Rationalised the use of die() croaker() and carper() (some things were carping
when they should have been croaking).
- Used the OO style of calling print() and printf() so that $this->{mtn_in}
could be used directly.
- Short reads on reading data cause errors rather than a blocking read.
- Restructured some code in mtn_command_with_options() to be more logically
grouped.
- Failure to read the new format header does not obscure potentially more
helpful error messages.
Changes:
Mlib/Monotone/AutomateStdio.pm (39 diffs)
Mmtn-tester-results.log (10 diffs)

File differences

lib/Monotone/AutomateStdio.pm
6363
6464
6565
66
67
66
6867
6968
7069
......
127126
128127
129128
130
129
131130
132131
133
134
132
135133
136134
137135
......
260258
261259
262260
263
261
264262
265263
266264
267265
268266
269267
270
271268
272269
273270
......
612609
613610
614611
615
616
617612
618613
619614
......
629624
630625
631626
632
627
628
629
630
631
633632
634
635
636
637633
638634
639635
640636
641637
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689638
690639
691640
......
862811
863812
864813
865
814
866815
867816
868817
......
13261275
13271276
13281277
1329
1278
13301279
13311280
13321281
......
16681617
16691618
16701619
1671
1620
16721621
16731622
16741623
......
18131762
18141763
18151764
1816
1765
18171766
18181767
18191768
......
23152264
23162265
23172266
2318
2267
23192268
23202269
23212270
......
28162765
28172766
28182767
2819
2820
2821
2768
28222769
28232770
28242771
......
28792826
28802827
28812828
2882
2829
28832830
28842831
28852832
......
30282975
30292976
30302977
3031
2978
30322979
30332980
30342981
......
35263473
35273474
35283475
3529
3476
35303477
35313478
35323479
......
36523599
36533600
36543601
3655
3602
36563603
36573604
36583605
......
36643611
36653612
36663613
3667
3614
36683615
36693616
36703617
......
37923739
37933740
37943741
3795
3742
37963743
37973744
37983745
......
39713918
39723919
39733920
3974
3921
39753922
39763923
39773924
......
39793926
39803927
39813928
3982
3929
39833930
39843931
39853932
......
40033950
40043951
40053952
4006
3953
40073954
40083955
4009
3956
40103957
40113958
40123959
......
40163963
40173964
40183965
4019
3966
40203967
40213968
40223969
......
40253972
40263973
40273974
4028
3975
40293976
40303977
4031
3978
40323979
40333980
40343981
......
42374184
42384185
42394186
4240
42414187
42424188
42434189
......
42914237
42924238
42934239
4294
42954240
42964241
4297
4242
42984243
42994244
43004245
......
43134258
43144259
43154260
4316
4317
4318
4319
4320
4261
4262
4263
4264
4265
43214266
4322
4267
43234268
4324
4269
43254270
43264271
43274272
......
43584303
43594304
43604305
4361
4306
4307
4308
43624309
43634310
43644311
4365
4312
43664313
43674314
43684315
......
43714318
43724319
43734320
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
43894321
43904322
43914323
......
44004332
44014333
44024334
4403
44044335
44054336
44064337
......
44114342
44124343
44134344
4414
4415
4345
4346
4347
44164348
4417
4349
44184350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
44194366
44204367
44214368
......
44314378
44324379
44334380
4434
44354381
44364382
44374383
......
45944540
45954541
45964542
4543
4544
4545
4546
45974547
45984548
45994549
......
47924742
47934743
47944744
4745
4746
4747
4748
47954749
47964750
47974751
......
49264880
49274881
49284882
4883
49294884
49304885
49314886
......
49954950
49964951
49974952
4998
4953
49994954
50004955
50014956
......
50304985
50314986
50324987
5033
4988
50344989
50354990
50364991
50374992
5038
4993
4994
50394995
50404996
50414997
5042
5043
5044
4998
4999
50455000
5046
5047
5048
5049
5050
5051
5052
5001
5002
5003
5004
5005
5006
5007
5008
50535009
5054
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
50555026
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
50685043
50695044
50705045
......
50785053
50795054
50805055
5081
5056
5057
50825058
50835059
50845060
......
50905066
50915067
50925068
5069
5070
5071
5072
5073
5074
50935075
50945076
50955077
......
52595241
52605242
52615243
5262
5244
5245
52635246
52645247
52655248
......
52905273
52915274
52925275
5293
5294
5295
5276
5277
5278
52965279
52975280
5298
5281
5282
5283
5284
5285
5286
5287
5288
52995289
53005290
53015291
5302
5303
5304
5292
53055293
53065294
5307
53085295
5309
5310
5311
5312
5313
53145296
53155297
53165298
use IO::File;
use IO::Poll qw(POLLHUP POLLIN POLLPRI);
use IPC::Open3;
use POSIX qw(:errno_h);
use Scalar::Util qw(refaddr weaken);
use POSIX qw(:errno_h :limits_h);
use Socket;
use Symbol qw(gensym);
use constant STRING_ENUM => 0x20; # E.g. "rename_source".
use constant STRING_LIST => 0x40; # E.g. "..." "...", possibly escaped.
# Private structures for managing outside-in style objects.
# Private structures for managing inside-out key caching style objects.
my $class_name = __PACKAGE__;
my(%class_objects,
%class_records);
my %class_records;
# Pre-compiled regular expressions for: finding the end of a quoted string
# possibly containing escaped quotes (i.e. " preceeded by a non-backslash
# ***** FUNCTIONAL PROTOTYPES *****
# Constructors, destructor and thread cloner.
# Constructors and destructor.
sub new_from_db($;$$);
sub new_from_service($$;$);
sub new_from_ws($;$$);
*new = *new_from_db;
sub DESTROY($);
sub CLONE();
# Public methods.
my $self = $_[0];
my $id;
# Make sure the destructor doesn't throw any exceptions and that any
# existing exception status is preserved, otherwise constructor
# exceptions could be lost. E.g. if the constructor throws an exception
local $@;
eval
{
$self->closedown();
eval
{
$self->closedown();
};
delete($class_records{$self->{$class_name}});
};
$id = $self->{$class_name};
delete($class_objects{$id});
delete($class_records{$id});
}
#
##############################################################################
#
# Routine - CLONE
#
# Description - Class thread cloner.
#
# Data - None.
#
##############################################################################
sub CLONE()
{
# Scan through the class registry, locating the newly cloned objects and
# update the class object store accordingly.
foreach my $old_id (CORE::keys(%class_objects))
{
my($new_id,
$object);
# Look under the old id to find the newly cloned object.
$object = $class_objects{$old_id};
$new_id = refaddr($object);
# Update the entry for the class record by refiling it under the new
# unique id for the newly cloned object.
$class_records{$new_id} = $class_records{$old_id};
delete($class_records{$old_id});
# Update the id cache in the object itself and then refile our weak
# reference to the object (not counted) under its new unique id.
$object->{$class_name} = $new_id;
$class_objects{$new_id} = $object;
weaken($class_objects{$new_id});
delete($class_objects{$old_id});
}
}
#
##############################################################################
#
# Routine - ancestors
#
# Description - Get a list of ancestors for the specified revisions.
foreach my $key ("key", "name", "signature", "trust", "value")
{
&$croaker("Corrupt certs list, expected " . $key
. " field but didn't find it")
. " field but did not find it")
unless (exists($kv_record->{$key}));
}
push(@$ref, $kv_record);
if (exists($kv_record->{attr}))
{
&$croaker("Corrupt attributes list, expected state field "
. "but didn't find it")
. "but did not find it")
unless (exists($kv_record->{state}));
push(@$ref, {attribute => $kv_record->{attr}->[0],
value => $kv_record->{attr}->[1],
else
{
&$croaker("Corrupt variables list, expected domain field "
. "but didn't find it");
. "but did not find it");
}
}
}
else
{
&$croaker("Corrupt manifest, expected content field but "
. "didn't find it");
. "did not find it");
}
}
if ($lines[$i] =~ m/^ *dir \"/)
foreach my $key (@valid_fields)
{
&$croaker("Corrupt keys list, expected " . $key
. " field but didn't find it")
. " field but did not find it")
unless (exists($kv_record->{$key}));
}
push(@$ref, $kv_record);
# Wrong number of arguments.
$this->{error_msg} = "Wrong number of arguments given";
&$carper($this->{error_msg});
return;
&$croaker("Wrong number of arguments given");
}
foreach my $key ("ancestor", "right")
{
&$croaker("Corrupt show_conflicts list, expected "
. $key . " field but didn't find it")
. $key . " field but did not find it")
unless (exists($kv_record->{$key}));
}
}
foreach my $key ("revision", "signer")
{
&$croaker("Corrupt tags list, expected " . $key
. " field but didn't find it")
. " field but did not find it")
unless (exists($kv_record->{$key}));
}
$kv_record->{branches} = []
}
else
{
croak("Unknown error handler severity");
&$croaker("Unknown error handler severity");
}
}
if (defined($handle)
&& ref($handle) !~ m/^IO::[^:]+/ && ref($handle) ne "GLOB")
{
croak("Handle must be either undef or a valid handle");
&$croaker("Handle must be either undef or a valid handle");
}
if ($stream == MTN_P_STREAM)
{
}
else
{
croak("Unknown stream specified");
&$croaker("Unknown stream specified");
}
}
}
else
{
croak("Unknown feature requested");
&$croaker("Unknown feature requested");
}
return;
elsif (exists($kv_record->{add_file}))
{
&$croaker("Corrupt revision, expected content field but "
. "didn't find it")
. "did not find it")
unless (exists($kv_record->{content}));
push(@$list, {type => "add_file",
name => $kv_record->{add_file},
}
elsif (exists($kv_record->{clear}))
{
&$croaker("Corrupt revision, expected attr field but didn't "
&$croaker("Corrupt revision, expected attr field but did not "
. "find it")
unless (exists($kv_record->{attr}));
push(@$list, {type => "clear",
}
elsif (exists($kv_record->{patch}))
{
&$croaker("Corrupt revision, expected from field but didn't "
&$croaker("Corrupt revision, expected from field but did not "
. "find it")
unless (exists($kv_record->{from}));
&$croaker("Corrupt revision, expected to field but didn't "
&$croaker("Corrupt revision, expected to field but did not "
. "find it")
unless (exists($kv_record->{to}));
push(@$list, {type => "patch",
}
elsif (exists($kv_record->{rename}))
{
&$croaker("Corrupt revision, expected to field but didn't "
&$croaker("Corrupt revision, expected to field but did not "
. "find it")
unless (exists($kv_record->{to}));
push(@$list, {type => "rename",
}
elsif (exists($kv_record->{set}))
{
&$croaker("Corrupt revision, expected attr field but didn't "
&$croaker("Corrupt revision, expected attr field but did not "
. "find it")
unless (exists($kv_record->{attr}));
&$croaker("Corrupt revision, expected value field but didn't "
&$croaker("Corrupt revision, expected value field but did not "
. "find it")
unless (exists($kv_record->{value}));
push(@$list, {type => "set",
$db_locked_exception,
$handler,
$handler_data,
$in,
$opt,
$param,
$read_ok,
# Send the command.
$in = $this->{mtn_in};
if (scalar(@$options) > 0)
{
printf($in "o");
$this->{mtn_in}->print("o");
foreach $opt (@$options)
{
my($key,
$key_ref = \$opt->{key};
$value_ref = \$opt->{value};
}
printf($in "%d:%s%d:%s",
length($$key_ref),
$$key_ref,
length($$value_ref),
$$value_ref);
$this->{mtn_in}->printf("%d:%s%d:%s",
length($$key_ref),
$$key_ref,
length($$value_ref),
$$value_ref);
}
printf($in "e ");
$this->{mtn_in}->print("e ");
}
printf($in "l%d:%s", length($cmd), $cmd);
$this->{mtn_in}->printf("l%d:%s", length($cmd), $cmd);
foreach $param (@parameters)
{
$param_ref = \$param;
}
}
printf($in "%d:%s", length($$param_ref), $$param_ref);
$this->{mtn_in}->printf("%d:%s",
length($$param_ref),
$$param_ref);
}
}
print($in "e\n");
$this->{mtn_in}->print("e\n");
# Attempt to read the output of the command, rethrowing any exception
# that does not relate to locked databases.
eval
{
$read_ok = $self->mtn_read_output($buffer_ref);
if ($read_ok && $in_as_utf8)
{
local $@;
eval
{
$$buffer_ref = decode_utf8($$buffer_ref, Encode::FB_CROAK);
};
if ($@)
{
$this->{error_msg} = "The output from Monotone was not "
. "UTF-8 encoded as expected";
&$carper($this->{error_msg});
return;
}
}
};
if ($@)
{
# get_pid() will return 0 and the caller can then distinguish
# between a handled exit and one that should be dealt with.
$in = undef;
$self->closedown();
$db_locked_exception = 1;
}
}
# Deal with locked database exceptions and any warning messages that
# appeared in the output.
# If the data was read in ok then carry out any necessary character set
# conversions. Otherwise deal with locked database exceptions and any
# warning messages that appeared in the output.
if (! $read_ok)
if ($read_ok && $in_as_utf8)
{
local $@;
eval
{
$$buffer_ref = decode_utf8($$buffer_ref, Encode::FB_CROAK);
};
if ($@)
{
$this->{error_msg} = "The output from Monotone was not UTF-8 "
. "encoded as expected";
&$carper($this->{error_msg});
return;
}
}
elsif (! $read_ok)
{
# See if we are to retry on database locked conditions.
if ($retry)
{
$in = undef;
$self->closedown();
}
else
{
croak("sysread failed: " . $!);
}
elsif ($bytes_read == 0)
{
croak("Short data read");
}
$size -= $bytes_read;
$offset += $bytes_read;
}
{
croak("sysread failed: " . $!);
}
elsif ($bytes_read == 0)
{
croak("Short data read");
}
$size -= $bytes_read;
$$offset_ref += $bytes_read;
}
$cwd,
$file,
$exception,
$header_err,
$line,
$my_pid,
$version);
# In the child process so all we can do is complain and exit.
print(STDERR "open3 failed: " . $exception);
STDERR->print("open3 failed: " . $exception . "\n");
exit(1);
}
}
}
$file->close();
&$croaker("Could not determine the version of Monotone")
&$croaker("Could not determine the version of Monotone being used")
unless (defined($mtn_version));
}
# If the version is higher than 0.45 then we need to skip the header
# which is terminated by two blank lines.
# which is terminated by two blank lines (put any errors into
# $header_err as we need to defer any error reporting until later).
if ($mtn_version > 0.45)
{
my($char,
$last_char);
if (defined($this->{network_service}))
local $@;
eval
{
my $poll_result;
for (my $i = 0;
$i < 10
&& ($poll_result
= $this->{poll}->poll($io_wait_handler_timeout))
== 0;
++ $i)
my($char,
$last_char);
# If we are connecting to a network service then make sure that
# it has sent us something before doing a blocking read.
if (defined($this->{network_service}))
{
&$io_wait_handler($self, $io_wait_handler_data);
my $poll_result;
for (my $i = 0;
$i < 10
&& ($poll_result =
$this->{poll}->poll($io_wait_handler_timeout))
== 0;
++ $i)
{
&$io_wait_handler($self, $io_wait_handler_data);
}
if ($poll_result == 0)
{
$header_err = "Cannot connect to service `"
. $this->{network_service} . "'";
die(1);
}
}
&$croaker("Cannot connect to service `"
. $this->{network_service} . "'")
if ($poll_result == 0);
}
$char = "";
do
{
$last_char = $char;
&$croaker("Cannot get format header")
unless (sysread($this->{mtn_out}, $char, 1));
}
while ($char ne "\n" || $last_char ne "\n")
# Skip the header.
$char = "";
do
{
$last_char = $char;
if (! sysread($this->{mtn_out}, $char, 1))
{
$header_err = "Cannot get format header";
die(1);
}
}
while ($char ne "\n" || $last_char ne "\n");
};
}
# Set up the correct input handler depending upon the version of mtn.
*mtn_read_output = *mtn_read_output_format_1;
}
# Get the interface version.
# Get the interface version (remember also that if something failed
# above then this method will throw and exception giving the cause).
$self->interface_version(\$version);
if ($version =~ m/^(\d+)\.(\d+)$/)
&$croaker("Cannot get automate stdio interface version number");
}
# This should never happen as getting the interface version would have
# reported the real issue, but handle any header read issues just in
# case.
&$croaker($header_err) if (defined($header_err));
}
}
my $class = $_[0];
my ($id,
my ($counter,
$id,
$self,
$this);
io_wait_handler_data => undef,
io_wait_handler_timeout => 1};
# Create the actual object, using it's memory address as a unique key and
# store that unique key in the object in a field named after this class for
# later reference (saves us having to keep calling refaddr()).
# Create the actual object and a unique key (using rand() and duplication
# detection), then store this unique key in the object in a field named
# after this class for later reference.
$self = bless({}, $class);
$id = refaddr($self);
$counter = 0;
do
{
$id = int(rand(INT_MAX));
&$croaker("Exhausted unique object keys")
if ((++ $counter) == INT_MAX);
}
while (exists($class_records{$id}));
$self->{$class_name} = $id;
# Now file the object's record in the records store, filed under the
# object's unique key. Also stash a reference to the new object in the
# objects store filed under the same key. This will be used for keeping
# track of objects when they get cloned in multi-threaded applications.
# object's unique key.
$class_records{$id} = $this;
$class_objects{$id} = $self;
# Make sure our maintenance reference to the object does not get counted so
# as to allow for normal destruction.
weaken($class_objects{$id});
return $self;
}
mtn-tester-results.log
1949719497
1949819498
1949919499
19500
19501
19502
19503
19504
19505
19500
19501
19502
19503
19504
19505
1950619506
1950719507
1950819508
19509
19509
1951019510
1951119511
1951219512
......
4185941859
4186041860
4186141861
41862
41862
4186341863
4186441864
4186541865
......
4189541895
4189641896
4189741897
41898
41898
4189941899
4190041900
4190141901
......
280836280836
280837280837
280838280838
280839
280840
280841
280842
280843
280844
280845280839
280846280840
280847280841
......
280903280897
280904280898
280905280899
280900
280901
280902
280903
280904
280905
280906280906
280907280907
280908280908
......
281203281203
281204281204
281205281205
281206
281207
281208
281209
281210
281211
281212
281213
281214
281215
281216
281217
281218281206
281219281207
281220281208
......
281315281303
281316281304
281317281305
281306
281307
281308
281309
281310
281311
281312
281313
281314
281315
281316
281317
281318281318
281319281319
281320281320
......
281866281866
281867281867
281868281868
281869
281869
281870281870
281871281871
281872281872
......
281885281885
281886281886
281887281887
281888
281888
281889281889
281890281890
281891281891
......
283782283782
283783283783
283784283784
283785
283786
283787
283788
283789
283790
283791
283792
283793
283794
283795
283796
283797
283798
283799
283800
283801
283802
283803
283804
283805
283806
283807
283808
283809
283810
283811
283812
283813
283814
283815
283816
283817
283818
283819
283820
283821
283822
283785
283823283786
283824283787
====================
PROBLEM (2): misuse: internal line merger failed
at ../mtn-tester line 703
main::__ANON__(2, 'misuse: internal line merger failed', 'undef') called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 4750
Monotone::AutomateStdio::warning_handler_wrapper('misuse: internal line merger failed') called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 4133
Monotone::AutomateStdio::mtn_command_with_options('Monotone::AutomateStdio=HASH(0x87272cc)', 'file_merge', 1, 1, 'SCALAR(0x8784b28)', 'ARRAY(0x8aa6948)', '5fee1e9c463d3cd7439bea9c483d9d88d0b057d5', 'ui.cc', 'b9a5862a8ba577538f27c69656d8a6bb60ecb777', ...) called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 3886
Monotone::AutomateStdio::mtn_command('Monotone::AutomateStdio=HASH(0x87272cc)', 'file_merge', 1, 1, 'SCALAR(0x8784b28)', '5fee1e9c463d3cd7439bea9c483d9d88d0b057d5', 'ui.cc', 'b9a5862a8ba577538f27c69656d8a6bb60ecb777', 'ui.cc', ...) called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 1027
Monotone::AutomateStdio::file_merge('Monotone::AutomateStdio=HASH(0x87272cc)', 'SCALAR(0x8784b28)', '5fee1e9c463d3cd7439bea9c483d9d88d0b057d5', 'ui.cc', 'b9a5862a8ba577538f27c69656d8a6bb60ecb777', 'ui.cc') called at ../mtn-tester line 715
at ../mtn-tester line 704
main::__ANON__(2, 'misuse: internal line merger failed', 'undef') called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 5413
Monotone::AutomateStdio::warning_handler_wrapper('misuse: internal line merger failed') called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 4385
Monotone::AutomateStdio::mtn_command_with_options('Monotone::AutomateStdio=HASH(0x871c3f0)', 'file_merge', 1, 1, 'SCALAR(0x851ab28)', 'ARRAY(0x884c848)', '5fee1e9c463d3cd7439bea9c483d9d88d0b057d5', 'ui.cc', 'b9a5862a8ba577538f27c69656d8a6bb60ecb777', ...) called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 4131
Monotone::AutomateStdio::mtn_command('Monotone::AutomateStdio=HASH(0x871c3f0)', 'file_merge', 1, 1, 'SCALAR(0x851ab28)', '5fee1e9c463d3cd7439bea9c483d9d88d0b057d5', 'ui.cc', 'b9a5862a8ba577538f27c69656d8a6bb60ecb777', 'ui.cc', ...) called at /home/aecoope/code/monotone.ca/automate-stdio/lib/Monotone/AutomateStdio.pm line 1126
Monotone::AutomateStdio::file_merge('Monotone::AutomateStdio=HASH(0x871c3f0)', 'SCALAR(0x851ab28)', '5fee1e9c463d3cd7439bea9c483d9d88d0b057d5', 'ui.cc', 'b9a5862a8ba577538f27c69656d8a6bb60ecb777', 'ui.cc') called at ../mtn-tester line 716
OOPS: misuse: internal line merger failed
========== genkey ==========
$VAR1 = {
'hash' => '56ac76c803899cb0c7569d652723047b5d18bc78',
'hash' => '92d27af31aa2430ed4938bd25806602a3d3cf1bb',
'public_location' => [
'database',
'keystore'
========== get_option (getting the branch option value) ==========
Variable = `net.venge.monotone.contrib.lib.automate-stdio.test'
========== get_pid ==========
MTN process id = `26412'
MTN process id = `29041'
========== get_revision ==========
---------- Raw Data ----------
format_version "1"
}
];
========== get_workspace_root ==========
Variable = `/home/aecoope/code/monotone.ca/automate-stdio/MTN-0.45'
Variable = `/home/aecoope/code/monotone.ca/automate-stdio/MTN-0.46'
========== graph ==========
---------- Raw Data ----------
0005a23e30a9c2d3024d94773eec433bf9acb770 5bdcfee44a3e2da5fb0e437d3623f2227ea2fed4 9e65e330c0d76769296452d68d0c52335edb5f1a
local_name "jmmv@menta.net"
public_location "database"
hash [56ac76c803899cb0c7569d652723047b5d18bc78]
given_name "pooh.bear_XxX_1234@test-id.com"
local_name "pooh.bear_XxX_1234@test-id.com"
public_location "database" "keystore"
private_location "keystore"
hash [5daf6aee9709afea92b1cb9a8179687f66ea69f9]
given_name "lapo@lapo.it"
local_name "lapo@lapo.it"
local_name "mnicholson@digium.com"
public_location "database"
hash [92d27af31aa2430ed4938bd25806602a3d3cf1bb]
given_name "pooh.bear_XxX_1234@test-id.com"
local_name "pooh.bear_XxX_1234@test-id.com"
public_location "database" "keystore"
private_location "keystore"
hash [9a642175d1f06e69544a2785b71ee988b233a785]
given_name "herbold@stahlwille.de"
local_name "herbold@stahlwille.de"
'given_name' => 'jmmv@menta.net'
},
{
'hash' => '56ac76c803899cb0c7569d652723047b5d18bc78',
'public_location' => [
'database',
'keystore'
],
'local_name' => 'pooh.bear_XxX_1234@test-id.com',
'private_location' => [
'keystore'
],
'given_name' => 'pooh.bear_XxX_1234@test-id.com'
},
{
'hash' => '5daf6aee9709afea92b1cb9a8179687f66ea69f9',
'public_location' => [
'database'
'given_name' => 'mnicholson@digium.com'
},
{
'hash' => '92d27af31aa2430ed4938bd25806602a3d3cf1bb',
'public_location' => [
'database',
'keystore'
],
'local_name' => 'pooh.bear_XxX_1234@test-id.com',
'private_location' => [
'keystore'
],
'given_name' => 'pooh.bear_XxX_1234@test-id.com'
},
{
'hash' => '9a642175d1f06e69544a2785b71ee988b233a785',
'public_location' => [
'database'
9af372ca893b885a0388a540b0de3bd7b7db9bc9 patrick@georgi-clan.de
e5d7097b0d1064ee61732996fa6b79d4e23749b0 paul@ciphergoth.org
3005403ab8d3e3f20badb1aefb4e0a5f5f940648 piglet@aamilne.com
56ac76c803899cb0c7569d652723047b5d18bc78 pooh.bear_XxX_1234@test-id.com
92d27af31aa2430ed4938bd25806602a3d3cf1bb pooh.bear_XxX_1234@test-id.com
d37d08fafaece16e9a79b4ea853326624e185cbd richard@levitte.org
bc80b5567c22e4de9adbe60e2b0ece6480d6367f ripley@lapo.it
8ad89008af9db804b7cc26045f9c0f4b1e059c7a rse@engelschall.com
[private keys]
7fe029d85af4de40700778b9784ef488fac2c79c aecooper@coosoft.plus.com
56ac76c803899cb0c7569d652723047b5d18bc78 pooh.bear_XxX_1234@test-id.com
92d27af31aa2430ed4938bd25806602a3d3cf1bb pooh.bear_XxX_1234@test-id.com
========== roots ==========
$VAR1 = [
];
Last error message `misuse: internal line merger failed'
$VAR1 = \bless( {
'mtn_options' => [
'--key',
'aecooper@coosoft.plus.com'
],
'mtn_in' => \*Symbol::GEN11,
'ws_constructed' => undef,
'mtn_version' => undef,
'mtn_err' => \*Symbol::GEN10,
'honour_suspend_certs' => 1,
'mtn_out' => \*Symbol::GEN12,
'db_is_locked' => undef,
'error_msg' => 'misuse: internal line merger failed',
'io_wait_handler_data' => undef,
'poll' => bless( [
{
'5' => {
'GLOB(0x8934088)' => 19
}
},
{
'5' => 1
},
{
'GLOB(0x8934088)' => ${$VAR1}->{'mtn_out'}
}
], 'IO::Poll' ),
'io_wait_handler' => undef,
'db_locked_handler' => undef,
'ws_path' => '/home/aecoope/code/monotone.ca/automate-stdio/MTN-0.45',
'mtn_pid' => 26412,
'cmd_cnt' => 114,
'db_name' => undef,
'mtn_aif_major' => 11,
'mtn_aif_minor' => '0',
'db_locked_handler_data' => undef,
'io_wait_handler_timeout' => 1,
'convert_to_utf8' => undef,
'cd_to_ws_root' => 1
'Monotone::AutomateStdio' => 961884561
}, 'Monotone::AutomateStdio' );
Destroying object.

Archive Download the corresponding diff file

Branches

Tags

Quick Links:     www.monotone.ca    -     Downloads    -     Documentation    -     Wiki    -     Code Forge    -     Build Status