summaryrefslogtreecommitdiff
path: root/BitKeeper
diff options
context:
space:
mode:
authorunknown <monty@narttu.mysql.fi>2008-04-28 19:24:05 +0300
committerunknown <monty@narttu.mysql.fi>2008-04-28 19:24:05 +0300
commit50ceea65cf18a64db017f06d2be5197807927588 (patch)
treeff5ab0c71ce5a2792c4f169a880e0174f8e194ad /BitKeeper
parented5fe6d3eb5d702e2fe27de3c65c550ea0dbf17f (diff)
parentc481f6b3cf80f471321d2ef4e7c68fe9e6e5d0ca (diff)
downloadmariadb-git-50ceea65cf18a64db017f06d2be5197807927588.tar.gz
Merge mysql.com:/home/my/mysql-5.1
into mysql.com:/home/my/mysql-new BitKeeper/etc/ignore: auto-union BUILD/SETUP.sh: Auto merged CMakeLists.txt: Auto merged client/get_password.c: Auto merged client/mysqldump.c: Auto merged client/mysqltest.c: Auto merged cmd-line-utils/readline/bind.c: Auto merged cmd-line-utils/readline/display.c: Auto merged cmd-line-utils/readline/histexpand.c: Auto merged cmd-line-utils/readline/history.c: Auto merged cmd-line-utils/readline/readline.c: Auto merged cmd-line-utils/readline/text.c: Auto merged dbug/user.r: Auto merged extra/yassl/src/handshake.cpp: Auto merged include/config-win.h: Auto merged include/m_string.h: Auto merged include/my_global.h: Auto merged include/my_pthread.h: Auto merged include/mysql/plugin.h: Auto merged include/mysql_com.h: Auto merged include/thr_alarm.h: Auto merged libmysql/CMakeLists.txt: Auto merged libmysql/Makefile.shared: Auto merged libmysql/dll.c: Auto merged libmysql/get_password.c: Auto merged libmysql/libmysql.c: Auto merged libmysqld/Makefile.am: Auto merged mysql-test/lib/mtr_cases.pl: Auto merged mysql-test/mysql-test-run.pl: Auto merged mysql-test/r/alter_table.result: Auto merged mysql-test/r/change_user.result: Auto merged mysql-test/r/create.result: Auto merged mysql-test/r/innodb.result: Auto merged mysql-test/r/merge.result: Auto merged mysql-test/r/mix2_myisam.result: Auto merged mysql-test/r/mysqldump.result: Auto merged mysql-test/r/query_cache.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/valgrind.supp: Auto merged mysql-test/r/view.result: Auto merged mysql-test/suite/rpl/r/rpl_events.result: Auto merged mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test: Auto merged mysql-test/t/create.test: Auto merged mysql-test/t/mysqldump.test: Auto merged mysql-test/t/query_cache.test: Auto merged mysql-test/t/subselect.test: Auto merged mysql-test/t/variables.test: Auto merged mysql-test/t/view.test: Auto merged mysys/mf_iocache.c: Auto merged mysys/mf_tempfile.c: Auto merged mysys/my_atomic.c: Auto merged mysys/my_bit.c: Auto merged mysys/my_bitmap.c: Auto merged mysys/my_compress.c: Auto merged mysys/my_create.c: Auto merged mysys/my_delete.c: Auto merged mysys/my_error.c: Auto merged mysys/my_init.c: Auto merged mysys/my_open.c: Auto merged mysys/my_realloc.c: Auto merged mysys/my_rename.c: Auto merged mysys/my_symlink.c: Auto merged mysys/my_sync.c: Auto merged mysys/my_thr_init.c: Auto merged mysys/thr_alarm.c: Auto merged mysys/thr_lock.c: Auto merged scripts/make_binary_distribution.sh: Auto merged server-tools/instance-manager/mysql_connection.cc: Auto merged sql/CMakeLists.txt: Auto merged sql/Makefile.am: Auto merged sql/events.cc: Auto merged sql/field.cc: Auto merged sql/field.h: Auto merged sql/filesort.cc: Auto merged sql/gen_lex_hash.cc: Auto merged sql/ha_ndbcluster.cc: Auto merged sql/ha_partition.h: Auto merged sql/handler.h: Auto merged sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/item_strfunc.cc: Auto merged sql/item_strfunc.h: Auto merged sql/item_subselect.cc: Auto merged sql/lock.cc: Auto merged sql/log.cc: Auto merged sql/log_event.cc: Auto merged sql/net_serv.cc: Auto merged sql/opt_range.cc: Auto merged sql/partition_info.cc: Auto merged sql/rpl_injector.cc: Auto merged sql/set_var.cc: Auto merged sql/slave.cc: Auto merged sql/slave.h: Auto merged sql/sp_head.cc: Auto merged sql/sql_acl.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_cache.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_delete.cc: Auto merged sql/sql_load.cc: Auto merged sql/sql_plugin.cc: Auto merged sql/sql_prepare.cc: Auto merged sql/sql_repl.cc: Auto merged sql/sql_test.cc: Auto merged sql/sql_union.cc: Auto merged sql/sql_update.cc: Auto merged sql/sql_yacc.yy: Auto merged sql/table.cc: Auto merged sql/table.h: Auto merged sql/unireg.cc: Auto merged sql/share/errmsg.txt: Auto merged storage/csv/ha_tina.cc: Auto merged storage/csv/ha_tina.h: Auto merged storage/myisam/CMakeLists.txt: Auto merged storage/myisam/ft_boolean_search.c: Auto merged storage/myisam/ft_eval.c: Auto merged storage/myisam/ft_nlq_search.c: Auto merged storage/myisam/ft_parser.c: Auto merged storage/myisam/ft_static.c: Auto merged storage/myisam/ft_stopwords.c: Auto merged storage/myisam/ft_test1.c: Auto merged storage/myisam/ft_update.c: Auto merged storage/myisam/ha_myisam.cc: Auto merged storage/myisam/mi_check.c: Auto merged storage/myisam/mi_create.c: Auto merged storage/myisam/mi_delete.c: Auto merged storage/myisam/mi_delete_all.c: Auto merged storage/myisam/mi_dynrec.c: Auto merged storage/myisam/mi_key.c: Auto merged storage/myisam/mi_packrec.c: Auto merged storage/myisam/mi_range.c: Auto merged storage/myisam/mi_search.c: Auto merged storage/myisam/mi_test1.c: Auto merged storage/myisam/mi_test2.c: Auto merged storage/myisam/mi_test3.c: Auto merged storage/myisam/mi_unique.c: Auto merged storage/myisam/mi_write.c: Auto merged storage/myisam/myisamchk.c: Auto merged storage/myisam/myisamdef.h: Auto merged storage/myisam/myisampack.c: Auto merged storage/myisam/sort.c: Auto merged storage/myisam/sp_test.c: Auto merged support-files/mysql.spec.sh: Auto merged tests/mysql_client_test.c: Auto merged configure.in: Manual merge dbug/dbug.c: Restore to original state in Maria tree The big diff comes from a wrong pull from 5.0 -> 5.1 after backporting dbug to 5.0 from 5.1 include/Makefile.am: Manual merge include/my_atomic.h: Ignore changes include/my_base.h: Manual merge include/my_dbug.h: Use orginal my_dbug.h from maria tree include/my_handler.h: Manual merge include/my_sys.h: Manual merge include/myisam.h: Manual merge mysql-test/lib/mtr_report.pl: Manual merge mysql-test/r/myisam.result: Manual merge mysql-test/suite/binlog/r/binlog_unsafe.result: Manual merge mysql-test/suite/binlog/t/binlog_unsafe.test: Manual merge mysql-test/suite/rpl/r/rpl_row_flsh_tbls.result: Manual merge mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result: No changes mysql-test/suite/rpl/t/rpl_row_flsh_tbls.test: Manual merge mysql-test/t/change_user.test: Manual merge mysql-test/t/disabled.def: Manual merge mysql-test/t/merge.test: No changes mysql-test/t/myisam.test: Manual merge mysys/Makefile.am: Manual merge mysys/array.c: Manual merge mysys/mf_keycache.c: Manual merge mysys/my_getsystime.c: Manual merge mysys/my_handler.c: Manual merge mysys/my_pread.c: Manual merge mysys/safemalloc.c: Manual merge sql/ha_partition.cc: Manual merge sql/handler.cc: Manual merge sql/lex.h: Manual merge sql/mysql_priv.h: Manual merge sql/mysqld.cc: Manual merge sql/set_var.h: Manual merge sql/sql_class.cc: Manual merge sql/sql_insert.cc: Manual merge sql/sql_parse.cc: Manual merge sql/sql_select.cc: Manual merge sql/sql_show.cc: Manual merge sql/sql_table.cc: Manual merge storage/myisam/mi_checksum.c: No changes storage/myisam/mi_extra.c: Manual merge storage/myisam/mi_open.c: Manual merge storage/myisammrg/ha_myisammrg.cc: Manual merge strings/strmake.c: No changes
Diffstat (limited to 'BitKeeper')
-rwxr-xr-xBitKeeper/triggers/post-commit.innodb.pl22
-rwxr-xr-xBitKeeper/triggers/post-incoming.innodb.pl30
-rwxr-xr-xBitKeeper/triggers/pre-commit.innodb.pl21
-rw-r--r--BitKeeper/triggers/triggers-lib.pl356
4 files changed, 429 insertions, 0 deletions
diff --git a/BitKeeper/triggers/post-commit.innodb.pl b/BitKeeper/triggers/post-commit.innodb.pl
new file mode 100755
index 00000000000..44d98b04838
--- /dev/null
+++ b/BitKeeper/triggers/post-commit.innodb.pl
@@ -0,0 +1,22 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use FindBin;
+require "$FindBin::Bin/triggers-lib.pl";
+
+# Don't run unless commit was successful
+check_status() || exit 0;
+
+my $cset = latest_cset();
+
+# Read most recent ChangeSet's changed files. Send merge changes along, since
+# they'll need to be incorporated in InnoDB's source tree eventually.
+my $changes = innodb_get_changes('cset', $cset, 'yes')
+ or exit 0;
+
+innodb_send_changes_email($cset, $changes)
+ or exit 1;
+
+exit 0;
diff --git a/BitKeeper/triggers/post-incoming.innodb.pl b/BitKeeper/triggers/post-incoming.innodb.pl
new file mode 100755
index 00000000000..4b100d88037
--- /dev/null
+++ b/BitKeeper/triggers/post-incoming.innodb.pl
@@ -0,0 +1,30 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use FindBin;
+require "$FindBin::Bin/triggers-lib.pl";
+
+# Don't run unless push/pull was successful
+check_status() or exit 0;
+
+# Don't run if push/pull is in local clones
+exit 0 if repository_type() eq 'local';
+
+# For each pushed ChangeSet, check it for InnoDB files and send
+# diff of entire ChangeSet to InnoDB developers if such changes
+# exist.
+
+my $error = 0;
+
+foreach my $cset (read_bk_csetlist())
+{
+ my $changes = innodb_get_changes('cset', $cset, 'yes')
+ or next;
+
+ innodb_send_changes_email($cset, $changes)
+ or $error = 1;
+}
+
+exit ($error == 0 ? 0 : 1);
diff --git a/BitKeeper/triggers/pre-commit.innodb.pl b/BitKeeper/triggers/pre-commit.innodb.pl
new file mode 100755
index 00000000000..6e2b65113b0
--- /dev/null
+++ b/BitKeeper/triggers/pre-commit.innodb.pl
@@ -0,0 +1,21 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use FindBin;
+require "$FindBin::Bin/triggers-lib.pl";
+
+die "$0: Script error: \$BK_PENDING is not set in pre-commit trigger\n"
+ unless defined $ENV{BK_PENDING};
+
+# Read changed files from $BK_PENDING directly. Do not bother user about
+# merge changes; they don't have any choice, the merge must be done.
+my $changes = innodb_get_changes('file', $ENV{BK_PENDING}, undef)
+ or exit 0;
+
+innodb_inform_and_query_user($changes)
+ or exit 1; # Abort commit
+
+# OK, continue with commit
+exit 0;
diff --git a/BitKeeper/triggers/triggers-lib.pl b/BitKeeper/triggers/triggers-lib.pl
new file mode 100644
index 00000000000..65a334ba926
--- /dev/null
+++ b/BitKeeper/triggers/triggers-lib.pl
@@ -0,0 +1,356 @@
+# To use this convenience library in a trigger, simply require it at
+# at the top of the script. For example:
+#
+# #! /usr/bin/perl
+#
+# use FindBin;
+# require "$FindBin::Bin/triggers-lib.pl";
+#
+# FindBin is needed, because sometimes a trigger is called from the
+# RESYNC directory, and the trigger dir is ../BitKeeper/triggers
+
+use strict;
+use warnings;
+
+use Carp;
+use FindBin;
+
+
+my $mysql_version = "5.1";
+
+# These addresses must be kept current in all MySQL versions.
+# See the wiki page InnoDBandOracle.
+#my @innodb_to_email = ('dev_innodb_ww@oracle.com');
+#my @innodb_cc_email = ('dev-innodb@mysql.com');
+# FIXME: Keep this for testing; remove it once it's been used for a
+# week or two.
+my @innodb_to_email = ('tim@mysql.com');
+my @innodb_cc_email = ();
+
+# This is for MySQL >= 5.1. Regex which defines the InnoDB files
+# which should generally not be touched by MySQL developers.
+my $innodb_files_description = <<EOF;
+ storage/innobase/*
+ mysql-test/t/innodb* (except mysql-test/t/innodb_mysql*)
+ mysql-test/r/innodb* (except mysql-test/r/innodb_mysql*)
+EOF
+my $innodb_files_regex = qr{
+ ^
+ (
+ # Case 1: innobase/*
+ storage/innobase/
+ |
+ # Case 2: mysql-test/[tr]/innodb* (except innodb_mysql*)
+ mysql-test/(t|r)/SCCS/s.innodb
+ # The mysql-test/[tr]/innodb_mysql* are OK to edit
+ (?!_mysql)
+ )
+}x;
+
+
+# See 'bk help log', and the format of, e.g., $BK_PENDING.
+# Important: this already contains the terminating newline!
+my $file_rev_dspec = ':SFILE:|:REV:\n';
+
+my $bktmp = "$FindBin::Bin/../tmp";
+
+my $sendmail;
+foreach ('/usr/sbin/sendmail', 'sendmail') {
+ $sendmail = $_;
+ last if -x $sendmail;
+}
+my $from = $ENV{REAL_EMAIL} || $ENV{USER} . '@mysql.com';
+
+
+# close_or_warn
+# $fh file handle to be closed
+# $description description of the file handle
+# RETURN Return value of close($fh)
+#
+# Print a nice warning message if close() isn't successful. See
+# perldoc perlvar and perldoc -f close for details.
+
+sub close_or_warn (*$)
+{
+ my ($fh, $description) = @_;
+
+ my $status = close $fh;
+ if (not $status) {
+ warn "$0: error on close of '$description': ",
+ ($! ? "$!" : "exit status " . ($? >> 8)), "\n";
+ }
+
+ return $status;
+}
+
+
+# check_status
+# $warn If true, warn about bad status
+# RETURN TRUE, if $BK_STATUS is "OK"; FALSE otherwise
+#
+# Also checks the undocumented $BK_COMMIT env variable
+
+sub check_status
+{
+ my ($warn) = @_;
+
+ my $status = (grep { defined $_ }
+ $ENV{BK_STATUS}, $ENV{BK_COMMIT}, '<undef>')[0];
+
+ unless ($status eq 'OK')
+ {
+ warn "Bad BK_STATUS '$status'\n" if $warn;
+ return undef;
+ }
+
+ return 1;
+}
+
+
+# repository_location
+#
+# RETURN ('HOST', 'ROOT') for the repository being modified
+
+sub repository_location
+{
+ if ($ENV{BK_SIDE} eq 'client') {
+ return ($ENV{BK_HOST}, $ENV{BK_ROOT});
+ } else {
+ return ($ENV{BKD_HOST}, $ENV{BKD_ROOT});
+ }
+}
+
+
+# repository_type
+# RETURN:
+# 'main' for repo on bk-internal with post-incoming.bugdb trigger
+# 'team' for repo on bk-internal with post-incoming.queuepush.pl trigger
+# 'local' otherwise
+#
+# This definition may need to be modified if the host name or triggers change.
+
+sub repository_type
+{
+ my ($host, $root) = repository_location();
+
+ return 'local'
+ unless uc($host) eq 'BK-INTERNAL.MYSQL.COM'
+ and -e "$root/BitKeeper/triggers/post-incoming.queuepush.pl";
+
+ return 'main' if -e "$root/BitKeeper/triggers/post-incoming.bugdb";
+
+ return 'team';
+}
+
+
+# latest_cset
+# RETURN Key for most recent ChangeSet
+
+sub latest_cset {
+ chomp(my $retval = `bk changes -r+ -k`);
+ return $retval;
+}
+
+
+# read_bk_csetlist
+# RETURN list of cset keys from $BK_CSETLIST file
+sub read_bk_csetlist
+{
+ die "$0: script error: \$BK_CSETLIST not set\n"
+ unless defined $ENV{BK_CSETLIST};
+
+ open CSETS, '<', $ENV{BK_CSETLIST}
+ or die "$0: can't read \$BK_CSETLIST='$ENV{BK_CSETLIST}': $!\n";
+ chomp(my @csets = <CSETS>);
+ close_or_warn(CSETS, "\$BK_CSETLIST='$ENV{BK_CSETLIST}'");
+
+ return @csets;
+}
+
+
+# innodb_get_changes
+# $type 'file' or 'cset'
+# $value file name (e.g., $BK_PENDING) or ChangeSet key
+# $want_merge_changes flag; if false, merge changes will be ignored
+# RETURN A string describing the InnoDB changes, or undef if no changes
+#
+# The return value does *not* include ChangeSet comments, only per-file
+# comments.
+
+sub innodb_get_changes
+{
+ my ($type, $value, $want_merge_changes) = @_;
+
+ if ($type eq 'file')
+ {
+ open CHANGES, '<', $value
+ or die "$0: can't read '$value': $!\n";
+ }
+ elsif ($type eq 'cset')
+ {
+ open CHANGES, '-|', "bk changes -r'$value' -v -d'$file_rev_dspec'"
+ or die "$0: can't exec 'bk changes': $!\n";
+ }
+ else
+ {
+ croak "$0: script error: invalid type '$type'";
+ }
+
+ my @changes = grep { /$innodb_files_regex/ } <CHANGES>;
+
+ close_or_warn(CHANGES, "($type, '$value')");
+
+ return undef unless @changes;
+
+
+ # Set up a pipeline of 'bk log' commands to weed out unwanted deltas. We
+ # never want deltas which contain no actual changes. We may not want deltas
+ # which are merges.
+
+ my @filters;
+
+ # This tests if :LI: (lines inserted) or :LD: (lines deleted) is
+ # non-zero. That is, did this delta change the file contents?
+ push @filters,
+ "bk log -d'"
+ . "\$if(:LI: -gt 0){$file_rev_dspec}"
+ . "\$if(:LI: -eq 0){\$if(:LD: -gt 0){$file_rev_dspec}}"
+ . "' -";
+
+ push @filters, "bk log -d'\$unless(:MERGE:){$file_rev_dspec}' -"
+ unless $want_merge_changes;
+
+ my $tmpname = "$bktmp/ibchanges.txt";
+ my $pipeline = join(' | ', @filters) . " > $tmpname";
+ open TMP, '|-', $pipeline
+ or die "$0: can't exec [[$pipeline]]: $!\n";
+
+ print TMP @changes;
+ close_or_warn(TMP, "| $pipeline");
+
+ # Use bk log to describe the changes
+ open LOG, "bk log - < $tmpname |"
+ or die "$0: can't exec 'bk log - < $tmpname': $!\n";
+ my @log = <LOG>;
+ close_or_warn(LOG, "bk log - < $tmpname |");
+
+ unlink $tmpname;
+
+ return undef unless @log;
+
+ return join('', @log);
+}
+
+
+# Ask user if they really want to commit.
+# RETURN TRUE = YES, commit; FALSE = NO, do not commit
+
+sub innodb_inform_and_query_user
+{
+ my ($description) = @_;
+
+ my $tmpname = "$bktmp/ibquery.txt";
+
+ open MESSAGE, "> $tmpname"
+ or die "$0: can't write message to '$tmpname': $!";
+
+ print MESSAGE <<EOF;
+This ChangeSet modifies some files which should normally be changed by
+InnoDB developers only. In general, MySQL developers should not change:
+
+$innodb_files_description
+The following InnoDB files were modified:
+=========================================================
+$description
+=========================================================
+
+If you understand this, you may Commit these changes. The changes
+will be sent to the InnoDB developers at @{[join ', ', @innodb_to_email]},
+CC @{[join ', ', @innodb_cc_email]}.
+EOF
+
+ close_or_warn(MESSAGE, "$tmpname");
+
+ my $status = system('bk', 'prompt', '-w',
+ '-yCommit these changes', '-nDo not Commit', "-f$tmpname");
+
+ unlink $tmpname;
+
+ return ($status == 0 ? 1 : undef);
+}
+
+
+# innodb_send_changes_email
+# $cset The ChangeSet key
+# $description A (maybe brief) description of the changes
+# RETURN TRUE = Success, e-mail sent; FALSE = Failure
+#
+# Sends a complete diff of changes in $cset by e-mail.
+
+sub innodb_send_changes_email
+{
+ my ($cset, $description) = @_;
+
+ # FIXME: Much of this is duplicated in the 'post-commit' Bourne shell
+ # trigger
+
+ my $cset_short = `bk changes -r'$cset' -d':P:::I:'`;
+ my $cset_key = `bk changes -r'$cset' -d':KEY:'`;
+
+ my ($host, $bk_root) = repository_location();
+ my $type = repository_type();
+ (my $treename = $bk_root) =~ s,^.*/,,;
+
+ print "Nofifying InnoDB developers at ",
+ (join ', ', @innodb_to_email, @innodb_cc_email), "\n";
+
+ open SENDMAIL, '|-', "$sendmail -t"
+ or die "Can't exec '$sendmail -t': $!\n";
+
+ my @headers;
+ push @headers, "List-ID: <bk.innodb-$mysql_version>";
+ push @headers, "From: $from";
+ push @headers, "To: " . (join ', ', @innodb_to_email);
+ push @headers, "Cc: " . (join ', ', @innodb_cc_email) if @innodb_cc_email;
+ push @headers,
+ "Subject: InnoDB changes in $type $mysql_version tree ($cset_short)";
+ push @headers, "X-CSetKey: <$cset_key>";
+
+ print SENDMAIL map { "$_\n" } @headers, '';
+
+ if ($type eq 'main')
+ {
+ print SENDMAIL <<EOF;
+Changes pushed to $treename by $ENV{USER} affect the following
+files. These changes are in a $mysql_version main tree. They
+will be available publicly within 24 hours.
+EOF
+ }
+ elsif ($type eq 'team')
+ {
+ print SENDMAIL <<EOF;
+Changes added to $treename by $ENV{USER} affect the
+following files. These changes are in a $mysql_version team tree.
+EOF
+ }
+ else
+ {
+ print SENDMAIL <<EOF;
+A local commit by $ENV{USER} affects the following files. These
+changes are in a clone of a $mysql_version tree.
+EOF
+ }
+ print SENDMAIL "\n";
+ print SENDMAIL qx(bk changes -r'$cset');
+ print SENDMAIL "$description";
+ print SENDMAIL "The complete ChangeSet diffs follow.\n\n";
+ print SENDMAIL qx(bk rset -r'$cset' -ah | bk gnupatch -h -dup -T);
+
+ close_or_warn(SENDMAIL, "$sendmail -t")
+ or return undef;
+
+ return 1;
+}
+
+
+1;