зеркало из https://github.com/mozilla/pjs.git
new simulators to help with debugging.
This commit is contained in:
Родитель
a14c62e0bd
Коммит
77d8f7040c
|
@ -0,0 +1,287 @@
|
||||||
|
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
# BonsaiData.pm - A simulation of bonsai data for when there is not
|
||||||
|
# bonsai database availible.
|
||||||
|
|
||||||
|
|
||||||
|
# $Revision: 1.1 $
|
||||||
|
# $Date: 2003-05-12 13:51:20 $
|
||||||
|
# $Author: kestes%walrus.com $
|
||||||
|
# $Source: /home/jrmuizel/cvs-mirror/mozilla/webtools/tinderbox2/src/test/vcsim/BonsaiData.pm,v $
|
||||||
|
# $Name: $
|
||||||
|
|
||||||
|
|
||||||
|
# The contents of this file are subject to the Mozilla Public
|
||||||
|
# License Version 1.1 (the "License"); you may not use this file
|
||||||
|
# except in compliance with the License. You may obtain a copy of
|
||||||
|
# the License at http://www.mozilla.org/NPL/
|
||||||
|
#
|
||||||
|
# Software distributed under the License is distributed on an "AS
|
||||||
|
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
# implied. See the License for the specific language governing
|
||||||
|
# rights and limitations under the License.
|
||||||
|
#
|
||||||
|
# The Original Code is the Tinderbox build tool.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
# Corporation. Portions created by Netscape are
|
||||||
|
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
# Rights Reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
# complete rewrite by Ken Estes:
|
||||||
|
# kestes@staff.mail.com Old work.
|
||||||
|
# kestes@reefedge.com New work.
|
||||||
|
# kestes@walrus.com Home.
|
||||||
|
# Contributor(s):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
package BonsaiData;
|
||||||
|
|
||||||
|
|
||||||
|
# Standard perl libraries
|
||||||
|
|
||||||
|
use File::Basename;
|
||||||
|
|
||||||
|
|
||||||
|
# Tinderbox Specific Libraries
|
||||||
|
use lib '#tinder_libdir#';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@RECTYPES = qw( M A );
|
||||||
|
|
||||||
|
@AUTHORS = qw( bob steve joe alice john jane sue
|
||||||
|
dbaron%fas.harvard.edu timeless%mozdev.org
|
||||||
|
roc+%cs.cmu.edu) ;
|
||||||
|
|
||||||
|
@BASENAMES = (
|
||||||
|
'download.html',
|
||||||
|
'nsLocalFileOS2.cpp',
|
||||||
|
'nsLocalFileOS2.h',
|
||||||
|
'Makefile.in',
|
||||||
|
'.cvsignore',
|
||||||
|
'configure',
|
||||||
|
'rel_notes.txt',
|
||||||
|
'configure.in',
|
||||||
|
'file with spaces',
|
||||||
|
);
|
||||||
|
|
||||||
|
@DIRNAMES = qw(
|
||||||
|
/mozilla/webtools
|
||||||
|
mozilla/webtools/tinderbox2
|
||||||
|
mozilla/webtools/tinderbox2/src
|
||||||
|
);
|
||||||
|
|
||||||
|
@LOGS = (
|
||||||
|
'Initialize service at Standard constructor',
|
||||||
|
'Adding check for url recognition',
|
||||||
|
'bugid=186056 browser crashed on second call to applet using javascript
|
||||||
|
r=brendan@mozilla.org sr=beard@netscape.com',
|
||||||
|
'don\'t return a value from a |void| function. fixing ports bustage.',
|
||||||
|
'Leak cleaning.',
|
||||||
|
);
|
||||||
|
|
||||||
|
sub pickone {
|
||||||
|
my (@list) = @_;
|
||||||
|
|
||||||
|
my ($random_num) = rand scalar(@list);
|
||||||
|
$random_num =~ s/\..*//;
|
||||||
|
my $element = $list[$random_num];
|
||||||
|
|
||||||
|
return $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub time2cvsformat {
|
||||||
|
# convert time() format to cvs input format
|
||||||
|
my ($time) = @_;
|
||||||
|
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,
|
||||||
|
$year,$wday,$yday,$isdst) =
|
||||||
|
localttime($time);
|
||||||
|
|
||||||
|
$mon++;
|
||||||
|
$year += 1900;
|
||||||
|
|
||||||
|
# some versions of CVS give data in the format:
|
||||||
|
# 2001-01-04
|
||||||
|
# others use:
|
||||||
|
# 01/04
|
||||||
|
# we will simulate this by picking format for each line.
|
||||||
|
# though in real life any cvs output will have only one format.
|
||||||
|
|
||||||
|
my ($cvs_date_str);
|
||||||
|
|
||||||
|
my $num = rand 10;
|
||||||
|
if ($num >= 5) {
|
||||||
|
$cvs_date_str = sprintf("%02u-%02u-%04u %02u:%02u",
|
||||||
|
$year, $mon, $mday, $hour, $min,);
|
||||||
|
} else {
|
||||||
|
$cvs_date_str = sprintf("%02u/%02u %02u:%02u",
|
||||||
|
$mon, $mday, $hour, $min, );
|
||||||
|
}
|
||||||
|
|
||||||
|
return $cvs_date_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub simulate_cvs_version {
|
||||||
|
|
||||||
|
# Most revisions have only one number after the first .
|
||||||
|
# Though some are quite long
|
||||||
|
|
||||||
|
my $num = rand 10;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
if ($num >= 5) {
|
||||||
|
$num = 1;
|
||||||
|
}
|
||||||
|
my $suffix='';
|
||||||
|
foreach $i (1 .. $num) {
|
||||||
|
my $version = rand 200;
|
||||||
|
$version =~ s/\..*//;
|
||||||
|
|
||||||
|
$suffix .= '.'.$version;
|
||||||
|
}
|
||||||
|
|
||||||
|
# most revision numbers begin with 1 though there are a few 2 and 3
|
||||||
|
|
||||||
|
$num = rand 10;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
if ($num >= 3) {
|
||||||
|
$num = 0;
|
||||||
|
}
|
||||||
|
$num ++;
|
||||||
|
|
||||||
|
my $out = $num.$suffix;
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub get_tree_state {
|
||||||
|
my ($bonsai_tree) = @_;
|
||||||
|
|
||||||
|
return 'Open';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub save_tree_state {
|
||||||
|
my ($tree, $value) = @_;
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub get_checkin_data {
|
||||||
|
my ($bonsai_tree, $cvs_module, $cvs_branch, $date_min) = @_;
|
||||||
|
|
||||||
|
my @out;
|
||||||
|
my $time = $date_min;
|
||||||
|
my $time_now = time();
|
||||||
|
|
||||||
|
while ($time < $time_now) {
|
||||||
|
|
||||||
|
my $next_checkin = rand (60*30);
|
||||||
|
$next_checkin =~ s/\..*//;
|
||||||
|
|
||||||
|
$time += $next_checkin;
|
||||||
|
|
||||||
|
my (
|
||||||
|
$rectype, $date, $author, $revision,
|
||||||
|
$file, $repository_dir, $log,
|
||||||
|
$sticky, $branch,
|
||||||
|
$lines_added, $lines_removed,
|
||||||
|
);
|
||||||
|
|
||||||
|
# I do not use these Bonsai fields.
|
||||||
|
|
||||||
|
$lines_added = '<ignore>';
|
||||||
|
$lines_removed = '<ignore>';
|
||||||
|
$sticky = '<ignore>';
|
||||||
|
$branch = '<ignore>';
|
||||||
|
|
||||||
|
# In the simulation we usually have one single checkin but
|
||||||
|
# sometimes we get a bunch of files at the same time.
|
||||||
|
|
||||||
|
my $num = rand 10;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
if ($num >= 5) {
|
||||||
|
$num = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$author = pickone(@AUTHORS);
|
||||||
|
foreach $i (1 .. $num) {
|
||||||
|
|
||||||
|
$rectype = pickone(@RECTYPES);
|
||||||
|
$repository_dir = pickone(@DIRNAMES);
|
||||||
|
$revision = simulate_cvs_version();
|
||||||
|
$file = pickone(@BASENAMES);
|
||||||
|
$log = pickone(@LOGS);
|
||||||
|
|
||||||
|
@tmp = (
|
||||||
|
$rectype, $time, $author,
|
||||||
|
$repository, $repository_dir, $file,
|
||||||
|
$revision,
|
||||||
|
$sticky, $branch,
|
||||||
|
$lines_added, $lines_removed, $log,
|
||||||
|
);
|
||||||
|
|
||||||
|
push @out, [ @tmp ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($index) = {
|
||||||
|
'type' => 0,
|
||||||
|
'time' => 1,
|
||||||
|
'author' => 2,
|
||||||
|
'repository' => 3,
|
||||||
|
'dir' => 4,
|
||||||
|
'file' => 5,
|
||||||
|
'rev' => 6,
|
||||||
|
'sticky' => 7,
|
||||||
|
'branch' => 8,
|
||||||
|
'lines_added' => 9,
|
||||||
|
'lines_removed' => 10,
|
||||||
|
'log' => 11,
|
||||||
|
};
|
||||||
|
|
||||||
|
my $result = \@out;
|
||||||
|
return ($result, $index);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# This code looks like the code in
|
||||||
|
# ~/mozilla/webtools/tinderbox2/src/lib/TinderDB/VC_Bonsai.pm so I can
|
||||||
|
# checkhow BonsaiData::get_checkin_data is used.
|
||||||
|
|
||||||
|
sub test {
|
||||||
|
|
||||||
|
my $last_cvs_data = time() - (2*24*60*60);
|
||||||
|
my ($results, $i) =
|
||||||
|
BonsaiData::get_checkin_data(
|
||||||
|
'<ignored>',
|
||||||
|
'<ignored>',
|
||||||
|
'<ignored>',
|
||||||
|
$last_cvs_data,
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach $r (@{ $results }) {
|
||||||
|
|
||||||
|
my ($time) = $r->[$$i{'time'}];
|
||||||
|
my ($author) = $r->[$$i{'author'}];
|
||||||
|
my ($dir) = $r->[$$i{'dir'}];
|
||||||
|
my ($file) = $r->[$$i{'file'}];
|
||||||
|
my ($log) = $r->[$$i{'log'}];
|
||||||
|
|
||||||
|
print "time: $time author: $author\n".
|
||||||
|
"dir: $dir file: $file\n".
|
||||||
|
"log: $log\n".
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
|
@ -0,0 +1,537 @@
|
||||||
|
#!#perl# #perlflags# --
|
||||||
|
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
||||||
|
#
|
||||||
|
|
||||||
|
# p4 - simulate the output of the command:
|
||||||
|
# p4 describe -s 567 568 569
|
||||||
|
# So that I can debug tinderbox on machines where this
|
||||||
|
# program is not installed.
|
||||||
|
|
||||||
|
# $Revision: 1.1 $
|
||||||
|
# $Date: 2003-05-12 13:51:20 $
|
||||||
|
# $Author: kestes%walrus.com $
|
||||||
|
# $Source: /home/jrmuizel/cvs-mirror/mozilla/webtools/tinderbox2/src/test/vcsim/p4,v $
|
||||||
|
# $Name: $
|
||||||
|
|
||||||
|
|
||||||
|
# The contents of this file are subject to the Mozilla Public
|
||||||
|
# License Version 1.1 (the "License"); you may not use this file
|
||||||
|
# except in compliance with the License. You may obtain a copy of
|
||||||
|
# the License at http://www.mozilla.org/NPL/
|
||||||
|
#
|
||||||
|
# Software distributed under the License is distributed on an "AS
|
||||||
|
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
# implied. See the License for the specific language governing
|
||||||
|
# rights and limitations under the License.
|
||||||
|
#
|
||||||
|
# The Original Code is the Tinderbox build tool.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
# Corporation. Portions created by Netscape are
|
||||||
|
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
# Rights Reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
# complete rewrite by Ken Estes:
|
||||||
|
# kestes@staff.mail.com Old work.
|
||||||
|
# kestes@reefedge.com New work.
|
||||||
|
# kestes@walrus.com Home.
|
||||||
|
# Contributor(s):
|
||||||
|
|
||||||
|
|
||||||
|
use Time::Local;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
|
||||||
|
# the list of types which can appear with a file update
|
||||||
|
|
||||||
|
@ACTIONTYPES = qw(add delete edit edit edit edit edit edit edit edit);
|
||||||
|
|
||||||
|
# the list of types which can appear with a job update
|
||||||
|
|
||||||
|
@STATUSTYPES = qw( *closed* );
|
||||||
|
@possible_statustypes =
|
||||||
|
( 'new', 'assigned', 'deferred', 'resolved', 'closed' );
|
||||||
|
|
||||||
|
# Some of these authors come directly from the Mozilla project, others
|
||||||
|
# look like the kind of CVS users I see on the projects I work on.
|
||||||
|
|
||||||
|
@AUTHORS = qw(
|
||||||
|
bob@my_workspace steve@ProjectWorkSpace
|
||||||
|
joe@tmp alice@elm_ws
|
||||||
|
john jane sue
|
||||||
|
) ;
|
||||||
|
|
||||||
|
# A list of typical file names.
|
||||||
|
|
||||||
|
@BASENAMES = (
|
||||||
|
'download.html',
|
||||||
|
'nsLocalFileOS2.cpp',
|
||||||
|
'nsLocalFileOS2.h',
|
||||||
|
'Makefile.in',
|
||||||
|
'.cvsignore',
|
||||||
|
'configure',
|
||||||
|
'rel_notes.txt',
|
||||||
|
'configure.in',
|
||||||
|
'file with spaces',
|
||||||
|
);
|
||||||
|
|
||||||
|
# Names of directories
|
||||||
|
|
||||||
|
@DIRNAMES = qw(
|
||||||
|
//mozilla/webtools
|
||||||
|
//mozilla/webtools/tinderbox2
|
||||||
|
//mozilla/webtools/tinderbox2/src
|
||||||
|
//mozilla/webtools/tinderbox2/src/lib
|
||||||
|
//mozilla/webtools/tinderbox2/src/bin
|
||||||
|
//mozilla/webtools/tinderbox2/src/man
|
||||||
|
);
|
||||||
|
|
||||||
|
@JOBNAMES = qw(
|
||||||
|
extraspacesinactions
|
||||||
|
multipletargetactions
|
||||||
|
recursiveontarget
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@CHANGESET_COMMENTS =
|
||||||
|
(
|
||||||
|
|
||||||
|
"\tIntegration of the Jam mainline into my branch\n",
|
||||||
|
|
||||||
|
"\tFix a misplaced shell quoting operation, simplify the code.\n",
|
||||||
|
|
||||||
|
|
||||||
|
"\tConvert to logging using VCP::Logger to reduce stdout/err spew.\n".
|
||||||
|
"\tSimplify & speed up debugging quite a bit.\n".
|
||||||
|
"\tProvide more verbose information in logs.\n".
|
||||||
|
"\tPrint to STDERR progress reports to keep users from wondering\n".
|
||||||
|
"\twhat's going on.\n".
|
||||||
|
"\tBreaks test; halfway through upgrading run3() to an inline\n".
|
||||||
|
"\tfunction for speed and for VCP specific features.\n",
|
||||||
|
|
||||||
|
"\tAdded copy/paste support in the depot view\n".
|
||||||
|
"\tAdded expand path to depot view\n".
|
||||||
|
"\tAdded bookmarks\n",
|
||||||
|
|
||||||
|
"\tMake destinations call back to sources to check out files to\n".
|
||||||
|
"\tsimplify the architecture (is_metadata_only() no longer needed)\n".
|
||||||
|
"\tand make it more optimizable (checkouts can be batched).\n",
|
||||||
|
|
||||||
|
"\tFinally fixed the stupid wrapping problem. Turns out there\n".
|
||||||
|
"\tare tabs in the text returned from Perforce. No problem.\n".
|
||||||
|
"\tBut in NSTextView if a tab occurs beyond the last tab stop\n".
|
||||||
|
"\tthen NSTextView breaks the line. So no what I want. The fix\n".
|
||||||
|
"\tis to create a bunch of tab stops out to the etherlands.\n".
|
||||||
|
|
||||||
|
"\tDouble the speed of the RCS file parser.\n".
|
||||||
|
"\tDeprecate VCP::Revs::shift() in favor of remove_all().\n",
|
||||||
|
|
||||||
|
"\tAdded double click support to the depot view and pending changelist\n".
|
||||||
|
"\tview. Added View File In Editor item on the pending changeist context\n".
|
||||||
|
"\tmenu.\n",
|
||||||
|
|
||||||
|
"\tMade multiple selection smarter by operating on the entire selection\n".
|
||||||
|
"\tas an atomic operation with the server. Also partially fixed the read\n".
|
||||||
|
"\tonly window to not wrap at the window boundary. I did the same for\n".
|
||||||
|
"\tthe editable window, but now the problem appears to be that p4 change\n".
|
||||||
|
"\t-o is breaking its output at some character location before the string\n".
|
||||||
|
"\tgets into the editor (at least I think that is the problem).\n",
|
||||||
|
|
||||||
|
"\tIntegration from the jam mainline. Note, many of these are empty\n".
|
||||||
|
"\t integrations, but I wanted to not leave any pending integrations \n".
|
||||||
|
"\t into my branch.\n",
|
||||||
|
|
||||||
|
|
||||||
|
"\tIntegration from //guest/craig_mcpheeters/work/jam/src/...\n".
|
||||||
|
"\tThis return incorporates all of the Alias|Wavefront extensions to\n".
|
||||||
|
"\t Jam, into an area which is a proper branch of the Jam mainline.\n".
|
||||||
|
"\t An integration of these files into the Jam mainline will show all\n".
|
||||||
|
"\t of the differences.\n".
|
||||||
|
"\tThere are several extensions to Jam in this return. Look at the\n".
|
||||||
|
"\t new file Jamfile.config for an explanation of the extensions, and\n".
|
||||||
|
"\t how to compile them into your own copy of Jam. If you want to \n".
|
||||||
|
"\t build a copy of Jam with all of the extensions, do this:\n".
|
||||||
|
"\t jam -sAllOptions=1\n".
|
||||||
|
"\t Read the config file for more info.\n".
|
||||||
|
"\tThe extensions range from minor output tweaks and simple fixes to\n".
|
||||||
|
"\t more major things like a header cache, serialization of output from\n".
|
||||||
|
"\t multiple jobs, dynamic command block sizing\n".
|
||||||
|
"\tThese are all offered without warranty, etc.\n",
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@JOB_COMMENTS =
|
||||||
|
(
|
||||||
|
|
||||||
|
"\tRepresentation for different filetypes.\n",
|
||||||
|
|
||||||
|
"\tRevision expansion - white \"prev\" lines not \n".
|
||||||
|
"\tdrawn for files without integration histories.\n",
|
||||||
|
|
||||||
|
"\tChange in \"if \$\(VAR\) in v1 v2 v3\" behavior\n",
|
||||||
|
|
||||||
|
"\tIrrelevant revisions are left lying around - they shouldn't \n".
|
||||||
|
"\tappear at all.\n",
|
||||||
|
|
||||||
|
"\tMax limit of 130 entities - can this be upped?\n",
|
||||||
|
|
||||||
|
"\tHighlight the \"main\" line of FileRevs in the revision\n".
|
||||||
|
"\tdisplay. (Requested at the 2001 Conference.)\n",
|
||||||
|
|
||||||
|
"\tRemove all tabs from Jam sources?\n",
|
||||||
|
|
||||||
|
"\tTEMPORARY is broken in stock Jam\n",
|
||||||
|
|
||||||
|
"\tTOGETHER targets not removed on failure\n",
|
||||||
|
|
||||||
|
"\tJam reverses slash direction on Windows\n",
|
||||||
|
|
||||||
|
"\tError in the definition of FIncludes and FDefines for NT and OS2\?\n",
|
||||||
|
|
||||||
|
"\tAnnoying several-second hangs if the server hasn't been\n".
|
||||||
|
"\taccessed for a while. To reproduce, leave P4HL running\n".
|
||||||
|
"\twithout input for a few minutes, and then try to get\n".
|
||||||
|
"\t\"p4 info\".\n",
|
||||||
|
|
||||||
|
"\tIf no depots are explicitly defined, assume that the default depot\n".
|
||||||
|
"\t\"depot\" is, and display it. Jambase: \"makeString\" rule calls\n".
|
||||||
|
"\tno-longer-existant \"FConcat\"\n",
|
||||||
|
|
||||||
|
"\tBranching display is arranged oddly for some complex\n".
|
||||||
|
"\tintegration scenarios. At present, ordering of branches\n".
|
||||||
|
"\tis determined by the last point of integration rather\n".
|
||||||
|
"\tthan by the initial branch point; further, all ancestors\n".
|
||||||
|
"\tof the mainline are put into place before any of the\n".
|
||||||
|
"\tdescendants are.\n",
|
||||||
|
|
||||||
|
"\tSuperfluous :E in Jambase\n",
|
||||||
|
|
||||||
|
"\t(P4HL support code) Attempts to store revs even if they can't be\n".
|
||||||
|
"\tindexed by change. This creates extra bogus FileRevs with a change of\n".
|
||||||
|
"\t\"\" - this only applies to changes submitted by ancient servers (before\n".
|
||||||
|
"\tsubmitted changes were numbered). In P4HL this is pretty harmless,\n".
|
||||||
|
"\tbut it does lead to creation of extra entities. In other applications\n".
|
||||||
|
"\tthis could lead to crashes, very hard-to-track down bugs, and me being\n".
|
||||||
|
"\tvery upset at myself when I find out what was causing the problem.\n",
|
||||||
|
|
||||||
|
|
||||||
|
"\t".'input:'."\n".
|
||||||
|
"\t".'x = [ MATCH (foo)(.*) : foo ] ;'."\n".
|
||||||
|
"\t".'ECHO -$(x)+ ;'."\n",
|
||||||
|
|
||||||
|
"\tInstallInto dependency and chmod problems\n",
|
||||||
|
|
||||||
|
"\tif ( \"\" a b ) returns false; was true in 2.3 \n",
|
||||||
|
|
||||||
|
"\tSIR: propagate \"unchangedness\" of updated but unchanged targets\n",
|
||||||
|
|
||||||
|
"\tUnreferenced local variables in jam 2.5 source code:\n",
|
||||||
|
|
||||||
|
"\tJam and ar archive format issues on AIX 4.3\n",
|
||||||
|
|
||||||
|
"\t@2826 p4 changes -m10 works okay but p4 -G changes -m10 lists 2826,\n".
|
||||||
|
"\t2825, and 2824. For whatever reason p4 -G returns fewer than 10\n".
|
||||||
|
"\tchanges.\n",
|
||||||
|
|
||||||
|
"\tConsider RSS2.0 as default output format\n".
|
||||||
|
"\tc.f. http://backend.userland.com/rss\n",
|
||||||
|
|
||||||
|
"\ttest of links: http://cnn.com\n",
|
||||||
|
|
||||||
|
"\tBefore executing an action with multiple targets, we have to update\n".
|
||||||
|
"\tevery dependants of all targets of the actions. (Not just the\n".
|
||||||
|
"\tdepenants of the target we're currently updating).\n",
|
||||||
|
|
||||||
|
"\tthis bug is a generalization of the bug submitted by \n".
|
||||||
|
"\thttp://maillist.perforce.com/pipermail/jamming/2001-December/001481.html\n",
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# choose an element of a list at random
|
||||||
|
|
||||||
|
sub pickone {
|
||||||
|
my (@list) = @_;
|
||||||
|
|
||||||
|
my ($random_num) = rand scalar(@list);
|
||||||
|
$random_num =~ s/\..*//;
|
||||||
|
my $element = $list[$random_num];
|
||||||
|
|
||||||
|
return $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Given a time in perl time format return a string which looks like a
|
||||||
|
# time string cvs would give us. There are two types of strings
|
||||||
|
# returned by different versioni of perl we randomly return a string
|
||||||
|
# of either type.
|
||||||
|
|
||||||
|
sub time2perforceFormat {
|
||||||
|
# convert time() format to the format which appears in perforce output
|
||||||
|
my ($time) = @_;
|
||||||
|
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,
|
||||||
|
$year,$wday,$yday,$isdst) =
|
||||||
|
localtime($time);
|
||||||
|
|
||||||
|
$mon++;
|
||||||
|
$year += 1900;
|
||||||
|
|
||||||
|
my ($date_str);
|
||||||
|
|
||||||
|
$date_str = sprintf("%04u/%02u/%02u %02u:%02u:%02u",
|
||||||
|
$year, $mon, $mday, $hour, $min, $sec);
|
||||||
|
return $date_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
# generate numbers which look like perforce revision numbers.
|
||||||
|
|
||||||
|
sub simulate_perforce_version {
|
||||||
|
|
||||||
|
# Most revisions have only one a single digit but there are some
|
||||||
|
# bigger revisions.
|
||||||
|
|
||||||
|
my $type = rand 10;
|
||||||
|
my $num;
|
||||||
|
if ($type >= 5) {
|
||||||
|
$num = rand 10;
|
||||||
|
} else {
|
||||||
|
$num = rand 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
# do not allow zero to be a version
|
||||||
|
$num ++;
|
||||||
|
|
||||||
|
return $num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub simulate_perforce_jobnum {
|
||||||
|
|
||||||
|
# some users pick names for jobs mostly jobs are give numbers.
|
||||||
|
|
||||||
|
my $num = rand 10;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
if ($num == 5) {
|
||||||
|
my $out = pickone(@JOBNAMES);
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Most revisions have only one a single digit but there are some
|
||||||
|
# bigger revisions.
|
||||||
|
|
||||||
|
my $type = rand 10;
|
||||||
|
my $num;
|
||||||
|
if ($type >= 5) {
|
||||||
|
$num = rand 10;
|
||||||
|
} else {
|
||||||
|
$num = rand 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
|
||||||
|
# do not allow zero to be a version
|
||||||
|
$num ++;
|
||||||
|
|
||||||
|
my $padding_size = 6 - length($num);
|
||||||
|
if ( $padding_size < 0 ) {
|
||||||
|
$padding_size = 0;
|
||||||
|
}
|
||||||
|
my $padding = '0' x $padding_size;
|
||||||
|
my $out = 'job'.$padding.$num;
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub parse_args {
|
||||||
|
|
||||||
|
# We must be able to simulate the cvs calls which tinderbox makes:
|
||||||
|
# p4 describe -s 1 2 3 4 5 6
|
||||||
|
|
||||||
|
@ORIG_ARGV = @ARGV;
|
||||||
|
|
||||||
|
while (scalar(@ARGV)) {
|
||||||
|
my $arg = shift(@ARGV);
|
||||||
|
|
||||||
|
($arg eq 'describe') &&
|
||||||
|
next;
|
||||||
|
|
||||||
|
($arg eq '-s') &&
|
||||||
|
(@CHANGE_NUMBERS = @ARGV);
|
||||||
|
}
|
||||||
|
|
||||||
|
$TIME_NOW = time();
|
||||||
|
|
||||||
|
scalar(@CHANGE_NUMBERS) ||
|
||||||
|
die ("argument '-s num' is required.\n");
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} # parse_args
|
||||||
|
|
||||||
|
|
||||||
|
sub simulate_files {
|
||||||
|
|
||||||
|
# In the simulation we usually have one single checkin but
|
||||||
|
# sometimes we get a bunch of files at the same time.
|
||||||
|
|
||||||
|
my $num = rand 10;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
# do not allow zero files to be modified
|
||||||
|
$num ++;
|
||||||
|
|
||||||
|
if ($num >= 5) {
|
||||||
|
$num = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($num) {
|
||||||
|
print "Affected files ...\n\n";
|
||||||
|
my $elipsis= '...';
|
||||||
|
|
||||||
|
foreach $i (1 .. $num) {
|
||||||
|
|
||||||
|
my $dirname = pickone(@DIRNAMES);
|
||||||
|
my $basename = pickone(@BASENAMES);
|
||||||
|
my $version = simulate_perforce_version();
|
||||||
|
my $actiontype = pickone(@ACTIONTYPES);
|
||||||
|
|
||||||
|
print "$elipsis $dirname$basename\#$version $actiontype\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub simulate_jobs{
|
||||||
|
|
||||||
|
# In the simulation we usually have no jobs or one single job but
|
||||||
|
# sometimes we get a bunch of files at the same time.
|
||||||
|
|
||||||
|
my $num = rand 20;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
if( $num >=10 ) {
|
||||||
|
$num = 0;
|
||||||
|
} elsif ($num >= 5) {
|
||||||
|
$num = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($num) {
|
||||||
|
print "Jobs fixed ...\n\n";
|
||||||
|
foreach $i (1 .. $num) {
|
||||||
|
|
||||||
|
# The parser ignores the date
|
||||||
|
my $date = '2003/05/11';
|
||||||
|
my $jobnum = simulate_perforce_jobnum();
|
||||||
|
my $author = pickone(@AUTHORS);
|
||||||
|
my $statustype = pickone(@STATUSTYPES);
|
||||||
|
my $comment = pickone(@JOB_COMMENTS);
|
||||||
|
|
||||||
|
print "$jobnum on $date by $author $statustype\n";
|
||||||
|
print "\n$comment\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
parse_args();
|
||||||
|
|
||||||
|
my $time = $DATE;
|
||||||
|
|
||||||
|
foreach $CHANGE_NUMBER (@CHANGE_NUMBERS) {
|
||||||
|
|
||||||
|
if( $CHANGE_NUMBER == 0 ) {
|
||||||
|
print STDERR "Invalid changelist number '0'.\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (0) {
|
||||||
|
|
||||||
|
if( $CHANGE_NUMBER == 1 ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($time < $TIME_NOW) {
|
||||||
|
|
||||||
|
my $next_checkin = rand (60*60*2);
|
||||||
|
$next_checkin =~ s/\..*//;
|
||||||
|
|
||||||
|
$time += $next_checkin;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
my $num = rand 10;
|
||||||
|
$num =~ s/\..*//;
|
||||||
|
if( $num == 5 ) {
|
||||||
|
# simulate being asked for a change list which does not yet exist.
|
||||||
|
|
||||||
|
print STDERR "$CHANGE_NUMBER - no such changelist.\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
my $author = pickone(@AUTHORS);
|
||||||
|
my $comment = pickone(@CHANGESET_COMMENTS);
|
||||||
|
my $date = '2003/05/11 18:58:44';
|
||||||
|
|
||||||
|
print "Change $CHANGE_NUMBER by $author on $date\n";
|
||||||
|
print "\n";
|
||||||
|
print "$comment\n";
|
||||||
|
|
||||||
|
simulate_jobs();
|
||||||
|
simulate_files();
|
||||||
|
|
||||||
|
}
|
||||||
|
exit 0;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
The new 'p4 logger' command tracks updates to jobs and
|
||||||
|
changelists, enabling external scripting to export such
|
||||||
|
changes. See 'p4 help logger' for more info.
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
kestes@linux:~/p4> p4 describe -s 3
|
||||||
|
Change 3 by kestes@testworkspace on 2003/05/11 18:58:44
|
||||||
|
|
||||||
|
test this comment with
|
||||||
|
tabs in it. do tabs
|
||||||
|
work for me?<enter description here>
|
||||||
|
|
||||||
|
Jobs fixed ...
|
||||||
|
|
||||||
|
job000001 on 2003/05/11 by kestes *closed*
|
||||||
|
|
||||||
|
try a job<enter description here>
|
||||||
|
|
||||||
|
job000002 on 2003/05/11 by kesteasdfs *closed*
|
||||||
|
|
||||||
|
you might like a job<enter description here>
|
||||||
|
|
||||||
|
job000003 on 2003/05/11 by xxxxxxxxxkestes *closed*
|
||||||
|
|
||||||
|
is this your job?<enter description here>
|
||||||
|
|
||||||
|
Affected files ...
|
||||||
|
|
||||||
|
... //depot/t1#3 edit
|
||||||
|
... //depot/t2#3 edit
|
||||||
|
... //depot/t3#3 edit
|
||||||
|
|
||||||
|
kestes@linux>
|
Загрузка…
Ссылка в новой задаче