thirdparty/svn/svn_load_dirs.pl
author Lennard de Rijk <ljvderijk@gmail.com>
Sat, 24 Jan 2009 00:27:36 +0000
changeset 942 2250bb08f8e2
parent 300 d36b597ef29d
permissions -rwxr-xr-x
Fixed bug in access.py concerning host checks. Patch by: Lennard de Rijk Reviewed by: to-be-reviewed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     1
#!/usr/bin/perl -w
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     2
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     3
# $HeadURL$
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     4
# $LastChangedDate$
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     5
# $LastChangedBy$
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     6
# $LastChangedRevision$
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     7
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     8
$| = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     9
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    10
use strict;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    11
use Carp;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    12
use Cwd;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    13
use Digest::MD5  2.20;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    14
use File::Copy   2.03;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    15
use File::Find;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    16
use File::Path   1.0404;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    17
use File::Temp   0.12   qw(tempdir tempfile);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    18
use Getopt::Long 2.25;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    19
use Text::Wrap;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    20
use URI          1.17;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    21
use English;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    22
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    23
$Text::Wrap::columns = 72;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    24
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    25
# Specify the location of the svn command.
300
d36b597ef29d Changed location of the svn command in svn_load_dirs.pl script from '/usr/bin/svn' to 'svn'. That makes the script more universal and it should work on Linux, Windows and Mac OS X if the svn is in the PATH.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 106
diff changeset
    26
my $svn = 'svn';
64
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    27
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    28
# Process the command line options.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    29
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    30
# The base URL for the portion of the repository to work in.  Note
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    31
# that this does not have to be the root of the subversion repository,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    32
# it can point to a subdirectory in the repository.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    33
my $repos_base_url;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    34
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    35
# The relative path from the repository base URL to work in to the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    36
# directory to load the input directories into.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    37
my $repos_load_rel_path;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    38
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    39
# To specify where tags, which are simply copies of the imported
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    40
# directory, should be placed relative to the repository base URL, use
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    41
# the -t command line option.  This value must contain regular
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    42
# expressions that match portions of the input directory names to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    43
# create an unique tag for each input directory.  The regular
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    44
# expressions are surrounded by a specified character to distinguish
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    45
# the regular expression from the normal directory path.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    46
my $opt_import_tag_location;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    47
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    48
# Do not ask for any user input.  Just go ahead and do everything.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    49
my $opt_no_user_input;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    50
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    51
# Do not automatically set the svn:executable property based on the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    52
# file's exe bit.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    53
my $opt_no_auto_exe;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    54
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    55
# Username to use for commits.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    56
my $opt_svn_username;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    57
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    58
# Password to use for commits.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    59
my $opt_svn_password;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    60
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    61
# Verbosity level.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    62
my $opt_verbose;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    63
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    64
# Path to already checked-out working copy.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    65
my $opt_existing_wc_dir;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    66
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    67
# List of filename patterns to ignore (as in .subversion/config's
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    68
# "global-ignores" option).
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    69
my $opt_glob_ignores;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    70
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    71
# This is the character used to separate regular expressions occuring
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    72
# in the tag directory path from the path itself.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    73
my $REGEX_SEP_CHAR = '@';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    74
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    75
# This specifies a configuration file that contains a list of regular
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    76
# expressions to check against a file and the properties to set on
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    77
# matching files.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    78
my $property_config_filename;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    79
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    80
GetOptions('no_user_input'           => \$opt_no_user_input,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    81
           'no_auto_exe'             => \$opt_no_auto_exe,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    82
           'property_cfg_filename=s' => \$property_config_filename,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    83
           'svn_password=s'          => \$opt_svn_password,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    84
           'svn_username=s'          => \$opt_svn_username,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    85
           'tag_location=s'          => \$opt_import_tag_location,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    86
           'verbose+'                => \$opt_verbose,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    87
           'wc=s'                    => \$opt_existing_wc_dir,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    88
           'glob_ignores=s'          => \$opt_glob_ignores)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    89
  or &usage;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    90
&usage("$0: too few arguments") if @ARGV < 2;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    91
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    92
$repos_base_url      = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    93
$repos_load_rel_path = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    94
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    95
# Check that the repository base URL and the import directories do not
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    96
# contain any ..'s.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    97
if ($repos_base_url =~ /\.{2}/)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    98
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    99
    die "$0: repos base URL $repos_base_url cannot contain ..'s.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   100
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   101
if ($repos_load_rel_path =~ /\.{2}/)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   102
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   103
    die "$0: repos import relative directory path $repos_load_rel_path ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   104
        "cannot contain ..'s.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   105
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   106
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   107
# If there are no directories listed on the command line, then the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   108
# directories are read from standard input.  In this case, the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   109
# -no_user_input command line option must be specified.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   110
if (!@ARGV and !$opt_no_user_input)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   111
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   112
    &usage("$0: must use -no_user_input if no dirs listed on command line.");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   113
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   114
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   115
# The tag option cannot be used when directories are read from
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   116
# standard input because tags may collide and no user input can be
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   117
# taken to verify that the input is ok.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   118
if (!@ARGV and $opt_import_tag_location)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   119
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   120
    &usage("$0: cannot use -tag_location when dirs are read from stdin.");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   121
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   122
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   123
# If the tag directory is set, then the import directory cannot be '.'.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   124
if (defined $opt_import_tag_location and $repos_load_rel_path eq '.')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   125
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   126
    &usage("$0: cannot set import_dir to '.' and use -t command line option.");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   127
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   128
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   129
# Set the svn command line options that are used anytime svn connects
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   130
# to the repository.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   131
my @svn_use_repos_cmd_opts;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   132
&set_svn_use_repos_cmd_opts($opt_svn_username, $opt_svn_password);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   133
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   134
# Check that the tag directories do not contain any ..'s.  Also, the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   135
# import and tag directories cannot be absolute.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   136
if (defined $opt_import_tag_location and $opt_import_tag_location =~ /\.{2}/)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   137
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   138
    die "$0: repos tag relative directory path $opt_import_tag_location ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   139
        "cannot contain ..'s.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   140
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   141
if ($repos_load_rel_path =~ m|^/|)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   142
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   143
    die "$0: repos import relative directory path $repos_load_rel_path ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   144
        "cannot start with /.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   145
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   146
if (defined $opt_import_tag_location and $opt_import_tag_location =~ m|^/|)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   147
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   148
    die "$0: repos tagrelative directory path $opt_import_tag_location ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   149
        "cannot start with /.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   150
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   151
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   152
if (defined $opt_existing_wc_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   153
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   154
    unless (-e $opt_existing_wc_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   155
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   156
        die "$0: working copy '$opt_existing_wc_dir' does not exist.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   157
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   158
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   159
    unless (-d _)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   160
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   161
        die "$0: working copy '$opt_existing_wc_dir' is not a directory.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   162
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   163
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   164
    unless (-d "$opt_existing_wc_dir/.svn")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   165
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   166
        die "$0: working copy '$opt_existing_wc_dir' does not have .svn ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   167
            "directory.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   168
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   169
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   170
    $opt_existing_wc_dir = Cwd::abs_path($opt_existing_wc_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   171
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   172
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   173
# If no glob_ignores specified, try to deduce from config file,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   174
# or use the default below.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   175
my $ignores_str =
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   176
    '*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   177
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   178
if ( defined $opt_glob_ignores)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   179
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   180
    $ignores_str = $opt_glob_ignores;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   181
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   182
elsif ( -f "$ENV{HOME}/.subversion/config" )
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   183
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   184
    open my $conf, "$ENV{HOME}/.subversion/config";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   185
    while (<$conf>)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   186
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   187
        if ( /^global-ignores\s*=\s*(.*?)\s*$/ )
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   188
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   189
	    $ignores_str = $1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   190
            last;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   191
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   192
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   193
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   194
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   195
my @glob_ignores = map
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   196
                     {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   197
                       s/\./\\\./g; s/\*/\.\*/g; "^$_\$";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   198
                     } split(/\s+/, $ignores_str);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   199
unshift @glob_ignores, '\.svn$';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   200
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   201
# Convert the string URL into a URI object.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   202
$repos_base_url    =~ s|/*$||;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   203
my $repos_base_uri = URI->new($repos_base_url);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   204
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   205
# Check that $repos_load_rel_path is not a directory here implying
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   206
# that a command line option was forgotten.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   207
if ($repos_load_rel_path ne '.' and -d $repos_load_rel_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   208
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   209
    die "$0: import_dir '$repos_load_rel_path' is a directory.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   210
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   211
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   212
# The remaining command line arguments should be directories.  Check
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   213
# that they all exist and that there are no duplicates.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   214
if (@ARGV)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   215
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   216
    my %dirs;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   217
    foreach my $dir (@ARGV)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   218
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   219
        unless (-e $dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   220
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   221
            die "$0: directory '$dir' does not exist.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   222
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   223
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   224
        unless (-d _)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   225
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   226
            die "$0: directory '$dir' is not a directory.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   227
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   228
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   229
        if ($dirs{$dir})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   230
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   231
            die "$0: directory '$dir' is listed more than once on command ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   232
                "line.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   233
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   234
        $dirs{$dir} = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   235
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   236
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   237
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   238
# Create the tag locations and print them for the user to review.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   239
# Check that there are no duplicate tags.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   240
my %load_tags;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   241
if (@ARGV and defined $opt_import_tag_location)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   242
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   243
    my %seen_tags;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   244
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   245
    foreach my $load_dir (@ARGV)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   246
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   247
        my $load_tag = &get_tag_dir($load_dir);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   248
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   249
        print "Directory $load_dir will be tagged as $load_tag\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   250
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   251
        if ($seen_tags{$load_tag})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   252
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   253
            die "$0: duplicate tag generated.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   254
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   255
        $seen_tags{$load_tag} = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   256
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   257
        $load_tags{$load_dir} = $load_tag;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   258
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   259
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   260
    exit 0 unless &get_answer("Please examine identified tags.  Are they " .
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   261
                              "acceptable? (Y/n) ", 'ny', 1);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   262
    print "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   263
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   264
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   265
# Load the property configuration filename, if one was specified, into
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   266
# an array of hashes, where each hash contains a regular expression
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   267
# and a property to apply to the file if the regular expression
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   268
# matches.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   269
my @property_settings;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   270
if (defined $property_config_filename and length $property_config_filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   271
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   272
    open(CFG, $property_config_filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   273
      or die "$0: cannot open '$property_config_filename' for reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   274
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   275
    my $ok = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   276
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   277
    while (my $line = <CFG>)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   278
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   279
        next if $line =~ /^\s*$/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   280
        next if $line =~ /^\s*#/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   281
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   282
        # Split the input line into words taking into account that
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   283
        # single or double quotes may define a single word with
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   284
        # whitespace in it.  The format for the file is
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   285
        # regex control property_name property_value
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   286
        my @line = &split_line($line);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   287
        next if @line == 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   288
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   289
        unless (@line == 2 or @line == 4)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   290
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   291
            warn "$0: line $. of '$property_config_filename' has to have 2 ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   292
                 "or 4 columns.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   293
            $ok = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   294
            next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   295
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   296
        my ($regex, $control, $property_name, $property_value) = @line;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   297
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   298
        unless ($control eq 'break' or $control eq 'cont')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   299
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   300
            warn "$0: line $. of '$property_config_filename' has illegal ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   301
                 "value for column 3 '$control', must be 'break' or 'cont'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   302
            $ok = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   303
            next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   304
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   305
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   306
        # Compile the regular expression.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   307
        my $re;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   308
        eval { $re = qr/$regex/i };
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   309
        if ($@)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   310
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   311
            warn "$0: line $. of '$property_config_filename' regex '$regex' ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   312
                 "does not compile:\n$@\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   313
            $ok = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   314
            next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   315
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   316
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   317
        push(@property_settings, {name    => $property_name,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   318
                                  value   => $property_value,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   319
                                  control => $control,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   320
                                  re      => $re});
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   321
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   322
    close(CFG)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   323
      or warn "$0: error in closing '$property_config_filename' for ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   324
              "reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   325
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   326
    exit 1 unless $ok;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   327
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   328
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   329
# Check that the svn base URL works by running svn log on it.  Only
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   330
# get the HEAD revision log message; there's no need to waste
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   331
# bandwidth seeing all of the log messages.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   332
print "Checking that the base URL is a Subversion repository.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   333
read_from_process($svn, 'log', '-r', 'HEAD',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   334
                  @svn_use_repos_cmd_opts, $repos_base_uri);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   335
print "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   336
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   337
my $orig_cwd = cwd;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   338
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   339
# The first step is to determine the root of the svn repository.  Do
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   340
# this with the svn log command.  Take the svn_url hostname and port
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   341
# as the initial url and append to it successive portions of the final
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   342
# path until svn log succeeds.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   343
print "Finding the root URL of the Subversion repository.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   344
my $repos_root_uri;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   345
my $repos_root_uri_path;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   346
my $repos_base_path_segment;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   347
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   348
  my $r = $repos_base_uri->clone;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   349
  my @path_segments            = grep { length($_) } $r->path_segments;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   350
  my @repos_base_path_segments = @path_segments;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   351
  unshift(@path_segments, '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   352
  $r->path('');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   353
  my @r_path_segments;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   354
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   355
  while (@path_segments)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   356
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   357
      $repos_root_uri_path = shift @path_segments;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   358
      push(@r_path_segments, $repos_root_uri_path);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   359
      $r->path_segments(@r_path_segments);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   360
      if (safe_read_from_pipe($svn, 'log', '-r', 'HEAD',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   361
                              @svn_use_repos_cmd_opts, $r) == 0)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   362
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   363
          $repos_root_uri = $r;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   364
          last;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   365
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   366
      shift @repos_base_path_segments;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   367
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   368
  $repos_base_path_segment = join('/', @repos_base_path_segments);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   369
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   370
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   371
if ($repos_root_uri)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   372
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   373
    print "Determined that the svn root URL is $repos_root_uri.\n\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   374
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   375
else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   376
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   377
    die "$0: cannot determine root svn URL.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   378
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   379
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   380
# Create a temporary directory for svn to work in.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   381
my $temp_dir = tempdir( "svn_load_dirs_XXXXXXXXXX", TMPDIR => 1 );
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   382
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   383
# Put in a signal handler to clean up any temporary directories.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   384
sub catch_signal {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   385
  my $signal = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   386
  warn "$0: caught signal $signal.  Quitting now.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   387
  exit 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   388
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   389
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   390
$SIG{HUP}  = \&catch_signal;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   391
$SIG{INT}  = \&catch_signal;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   392
$SIG{TERM} = \&catch_signal;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   393
$SIG{PIPE} = \&catch_signal;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   394
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   395
# Create an object that when DESTROY'ed will delete the temporary
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   396
# directory.  The CLEANUP flag to tempdir should do this, but they
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   397
# call rmtree with 1 as the last argument which takes extra security
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   398
# measures that do not clean up the .svn directories.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   399
my $temp_dir_cleanup = Temp::Delete->new;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   400
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   401
# Determine the native end of line style for this system.  Do this the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   402
# most portable way, by writing a file with a single \n in non-binary
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   403
# mode and then reading the file in binary mode.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   404
my $native_eol = &determine_native_eol;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   405
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   406
# Check if all the directories exist to load the directories into the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   407
# repository.  If not, ask if they should be created.  For tags, do
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   408
# not create the tag directory itself, that is done on the svn cp.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   409
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   410
  print "Finding if any directories need to be created in repository.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   411
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   412
  my @dirs_to_create;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   413
  my @urls_to_create;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   414
  my %seen_dir;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   415
  my @load_tags_without_last_segment;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   416
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   417
  # Assume that the last portion of the tag directory contains the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   418
  # version number and remove it from the directories to create,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   419
  # because the tag directory will be created by svn cp.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   420
  foreach my $load_tag (sort values %load_tags)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   421
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   422
      # Skip this tag if there is only one segment in its name.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   423
      my $index = rindex($load_tag, '/');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   424
      next if $index == -1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   425
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   426
      # Trim off the last segment and record the result.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   427
      push(@load_tags_without_last_segment, substr($load_tag, 0, $index));
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   428
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   429
  
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   430
  foreach my $dir ($repos_load_rel_path, @load_tags_without_last_segment)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   431
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   432
      next unless length $dir;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   433
      my $d = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   434
      foreach my $segment (split('/', $dir))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   435
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   436
          $d = length $d ? "$d/$segment" : $segment;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   437
          my $url = "$repos_base_url/$d";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   438
          unless ($seen_dir{$d})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   439
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   440
              $seen_dir{$d} = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   441
              if (safe_read_from_pipe($svn, 'log', '-r', 'HEAD',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   442
                                      @svn_use_repos_cmd_opts, $url) != 0)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   443
                {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   444
                  push(@dirs_to_create, $d);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   445
                  push(@urls_to_create, $url);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   446
                }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   447
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   448
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   449
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   450
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   451
  if (@dirs_to_create)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   452
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   453
      print "The following directories do not exist and need to exist:\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   454
      foreach my $dir (@dirs_to_create)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   455
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   456
          print "  $dir\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   457
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   458
      exit 0 unless &get_answer("You must add them now to load the " .
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   459
                                "directories.  Continue (Y/n)? ", 'ny', 1);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   460
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   461
      my $message = "Create directories to load project into.\n\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   462
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   463
      foreach my $dir (@dirs_to_create)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   464
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   465
          if (length $repos_base_path_segment)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   466
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   467
              $message .= "* $repos_base_path_segment/$dir: New directory.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   468
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   469
          else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   470
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   471
              $message .= "* $dir: New directory.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   472
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   473
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   474
      $message = wrap('', '  ', $message);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   475
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   476
      read_from_process($svn, 'mkdir', @svn_use_repos_cmd_opts,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   477
                        '-m', $message, @urls_to_create);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   478
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   479
  else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   480
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   481
      print "No directories need to be created to prepare repository.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   482
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   483
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   484
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   485
# Either checkout a new working copy from the repository or use an
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   486
# existing working copy.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   487
if (defined $opt_existing_wc_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   488
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   489
    # Update an already existing working copy.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   490
    print "Not checking out anything; using existing working directory at\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   491
    print "$opt_existing_wc_dir\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   492
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   493
    chdir($opt_existing_wc_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   494
      or die "$0: cannot chdir '$opt_existing_wc_dir': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   495
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   496
    read_from_process($svn, 'update', @svn_use_repos_cmd_opts);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   497
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   498
else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   499
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   500
    # Check out the svn repository starting at the svn URL into a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   501
    # fixed directory name.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   502
    my $checkout_dir_name = 'my_import_wc';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   503
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   504
    # Check out only the directory being imported to, otherwise the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   505
    # checkout of the entire base URL can be very huge, if it contains
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   506
    # a large number of tags.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   507
    my $checkout_url;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   508
    if ($repos_load_rel_path eq '.')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   509
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   510
        $checkout_url = $repos_base_url;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   511
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   512
    else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   513
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   514
        $checkout_url = "$repos_base_url/$repos_load_rel_path";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   515
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   516
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   517
    print "Checking out $checkout_url into $temp_dir/$checkout_dir_name\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   518
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   519
    chdir($temp_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   520
      or die "$0: cannot chdir '$temp_dir': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   521
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   522
    read_from_process($svn, 'checkout',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   523
                      @svn_use_repos_cmd_opts,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   524
                      $checkout_url, $checkout_dir_name);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   525
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   526
    chdir($checkout_dir_name)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   527
      or die "$0: cannot chdir '$checkout_dir_name': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   528
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   529
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   530
# At this point, the current working directory is the top level
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   531
# directory of the working copy.  Record the absolute path to this
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   532
# location because the script will chdir back here later on.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   533
my $wc_import_dir_cwd = cwd;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   534
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   535
# Set up the names for the path to the import and tag directories.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   536
my $repos_load_abs_path;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   537
if ($repos_load_rel_path eq '.')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   538
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   539
    $repos_load_abs_path = length($repos_base_path_segment) ?
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   540
                           $repos_base_path_segment : "/";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   541
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   542
else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   543
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   544
    $repos_load_abs_path = length($repos_base_path_segment) ?
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   545
                           "$repos_base_path_segment/$repos_load_rel_path" :
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   546
                           $repos_load_rel_path;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   547
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   548
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   549
# Now go through each source directory and copy each file from the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   550
# source directory to the target directory.  For new target files, add
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   551
# them to svn.  For files that no longer exist, delete them.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   552
my $print_rename_message = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   553
my @load_dirs            = @ARGV;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   554
while (defined (my $load_dir = &get_next_load_dir))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   555
  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   556
    my $load_tag = $load_tags{$load_dir};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   557
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   558
    if (defined $load_tag)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   559
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   560
        print "\nLoading $load_dir and will save in tag $load_tag.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   561
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   562
    else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   563
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   564
        print "\nLoading $load_dir.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   565
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   566
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   567
    # The first hash is keyed by the old name in a rename and the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   568
    # second by the new name.  The last variable contains a list of
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   569
    # old and new filenames in a rename.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   570
    my %rename_from_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   571
    my %rename_to_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   572
    my @renamed_filenames;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   573
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   574
    unless ($opt_no_user_input)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   575
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   576
        my $repeat_loop;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   577
        do
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   578
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   579
            $repeat_loop = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   580
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   581
            my %add_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   582
            my %del_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   583
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   584
            # Get the list of files and directories in the repository
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   585
            # working copy.  This hash is called %del_files because
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   586
            # each file or directory will be deleted from the hash
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   587
            # using the list of files and directories in the source
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   588
            # directory, leaving the files and directories that need
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   589
            # to be deleted.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   590
            %del_files = &recursive_ls_and_hash($wc_import_dir_cwd);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   591
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   592
            # This anonymous subroutine finds all the files and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   593
            # directories in the directory to load.  It notes the file
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   594
            # type and for each file found, it deletes it from
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   595
            # %del_files.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   596
            my $wanted = sub
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   597
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   598
                s#^\./##;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   599
                return if $_ eq '.';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   600
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   601
                my $source_path = $_;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   602
                my $dest_path   = "$wc_import_dir_cwd/$_";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   603
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   604
                my ($source_type) = &file_info($source_path);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   605
                my ($dest_type)   = &file_info($dest_path);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   606
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   607
                # Fail if the destination type exists but is of a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   608
                # different type of file than the source type.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   609
                if ($dest_type ne '0' and $source_type ne $dest_type)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   610
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   611
                    die "$0: does not handle changing source and destination ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   612
                        "type for '$source_path'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   613
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   614
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   615
                if ($source_type ne 'd' and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   616
                    $source_type ne 'f' and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   617
                    $source_type ne 'l')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   618
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   619
                    warn "$0: skipping loading file '$source_path' of type ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   620
                         "'$source_type'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   621
                    unless ($opt_no_user_input)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   622
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   623
                        print STDERR "Press return to continue: ";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   624
                        <STDIN>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   625
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   626
                    return;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   627
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   628
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   629
                unless (defined delete $del_files{$source_path})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   630
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   631
                    $add_files{$source_path}{type} = $source_type;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   632
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   633
              };
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   634
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   635
            # Now change into the directory containing the files to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   636
            # load.  First change to the original directory where this
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   637
            # script was run so that if the specified directory is a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   638
            # relative directory path, then the script can change into
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   639
            # it.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   640
            chdir($orig_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   641
              or die "$0: cannot chdir '$orig_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   642
            chdir($load_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   643
              or die "$0: cannot chdir '$load_dir': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   644
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   645
            find({no_chdir   => 1,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   646
                  preprocess => sub { sort { $b cmp $a }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   647
                                      grep { $_ !~ /^[._]svn$/ } @_ },
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   648
                  wanted     => $wanted
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   649
                 }, '.');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   650
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   651
            # At this point %add_files contains the list of new files
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   652
            # and directories to be created in the working copy tree
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   653
            # and %del_files contains the files and directories that
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   654
            # need to be deleted.  Because there may be renames that
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   655
            # have taken place, give the user the opportunity to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   656
            # rename any deleted files and directories to ones being
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   657
            # added.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   658
            my @add_files = sort keys %add_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   659
            my @del_files = sort keys %del_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   660
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   661
            # Because the source code management system may keep the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   662
            # original renamed file or directory in the working copy
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   663
            # until a commit, remove them from the list of deleted
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   664
            # files or directories.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   665
            &filter_renamed_files(\@del_files, \%rename_from_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   666
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   667
            # Now change into the working copy directory in case any
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   668
            # renames need to be performed.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   669
            chdir($wc_import_dir_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   670
              or die "$0: cannot chdir '$wc_import_dir_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   671
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   672
            # Only do renames if there are both added and deleted
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   673
            # files and directories.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   674
            if (@add_files and @del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   675
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   676
                my $max = @add_files > @del_files ? @add_files : @del_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   677
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   678
                # Print the files that have been added and deleted.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   679
                # Find the deleted file with the longest name and use
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   680
                # that for the width of the filename column.  Add one
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   681
                # to the filename width to let the directory /
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   682
                # character be appended to a directory name.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   683
                my $line_number_width = 4;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   684
                my $filename_width    = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   685
                foreach my $f (@del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   686
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   687
                    my $l = length($f);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   688
                    $filename_width = $l if $l > $filename_width;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   689
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   690
                ++$filename_width;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   691
                my $printf_format = "%${line_number_width}d";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   692
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   693
                if ($print_rename_message)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   694
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   695
                    $print_rename_message = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   696
                    print "\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   697
                      "The following table lists files and directories that\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   698
                      "exist in either the Subversion repository or the\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   699
                      "directory to be imported but not both.  You now have\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   700
                      "the opportunity to match them up as renames instead\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   701
                      "of deletes and adds.  This is a Good Thing as it'll\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   702
                      "make the repository take less space.\n\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   703
                      "The left column lists files and directories that\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   704
                      "exist in the Subversion repository and do not exist\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   705
                      "in the directory being imported.  The right column\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   706
                      "lists files and directories that exist in the\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   707
                      "directory being imported.  Match up a deleted item\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   708
                      "from the left column with an added item from the\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   709
                      "right column.  Note the line numbers on the left\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   710
                      "which you type into this script to have a rename\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   711
                      "performed.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   712
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   713
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   714
                # Sort the added and deleted files and directories by
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   715
                # the lowercase versions of their basenames instead of
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   716
                # their complete path, which makes finding files that
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   717
                # were moved into different directories easier to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   718
                # match up.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   719
                @add_files = map { $_->[0] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   720
                             sort { $a->[1] cmp $b->[1] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   721
                             map { [$_->[0], lc($_->[1])] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   722
                             map { [$_, m#([^/]+)$#] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   723
                             @add_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   724
                @del_files = map { $_->[0] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   725
                             sort { $a->[1] cmp $b->[1] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   726
                             map { [$_->[0], lc($_->[1])] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   727
                             map { [$_, m#([^/]+)$#] }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   728
                             @del_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   729
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   730
              RELIST:
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   731
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   732
                for (my $i=0; $i<$max; ++$i)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   733
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   734
                    my $add_filename = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   735
                    my $del_filename = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   736
                    if ($i < @add_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   737
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   738
                        $add_filename = $add_files[$i];
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   739
                        if ($add_files{$add_filename}{type} eq 'd')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   740
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   741
                            $add_filename .= '/';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   742
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   743
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   744
                    if ($i < @del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   745
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   746
                        $del_filename = $del_files[$i];
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   747
                        if ($del_files{$del_filename}{type} eq 'd')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   748
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   749
                            $del_filename .= '/';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   750
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   751
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   752
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   753
                    if ($i % 22 == 0)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   754
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   755
                        print
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   756
                          "\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   757
                          " " x $line_number_width,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   758
                          " ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   759
                          "Deleted", " " x ($filename_width-length("Deleted")),
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   760
                          " ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   761
                          "Added\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   762
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   763
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   764
                    printf $printf_format, $i;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   765
                    print  " ", $del_filename,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   766
                           "_" x ($filename_width - length($del_filename)),
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   767
                           " ", $add_filename, "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   768
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   769
                    if (($i+1) % 22 == 0)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   770
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   771
                        unless (&get_answer("Continue printing (Y/n)? ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   772
                                            'ny', 1))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   773
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   774
                            last;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   775
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   776
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   777
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   778
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   779
                # Get the feedback from the user.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   780
                my $line;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   781
                my $add_filename;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   782
                my $add_index;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   783
                my $del_filename;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   784
                my $del_index;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   785
                my $got_line = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   786
                do {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   787
                  print "Enter two indexes for each column to rename, ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   788
                        "(R)elist, or (F)inish: ";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   789
                  $line = <STDIN>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   790
                  $line = '' unless defined $line;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   791
                  if ($line =~ /^R$/i )
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   792
                    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   793
                      goto RELIST;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   794
                    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   795
                  
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   796
                  if ($line =~ /^F$/i)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   797
                    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   798
                      $got_line = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   799
                    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   800
                  elsif ($line =~ /^(\d+)\s+(\d+)$/)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   801
                    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   802
                      print "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   803
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   804
                      $del_index = $1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   805
                      $add_index = $2;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   806
                      if ($del_index >= @del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   807
                        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   808
                          print "Delete index $del_index is larger than ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   809
                                "maximum index of ", scalar @del_files - 1,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   810
                                ".\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   811
                          $del_index = undef;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   812
                        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   813
                      if ($add_index > @add_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   814
                        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   815
                          print "Add index $add_index is larger than maximum ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   816
                                "index of ", scalar @add_files - 1, ".\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   817
                          $add_index = undef;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   818
                        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   819
                      $got_line = defined $del_index && defined $add_index;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   820
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   821
                      # Check that the file or directory to be renamed
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   822
                      # has the same file type.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   823
                      if ($got_line)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   824
                        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   825
                          $add_filename = $add_files[$add_index];
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   826
                          $del_filename = $del_files[$del_index];
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   827
                          if ($add_files{$add_filename}{type} ne
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   828
                              $del_files{$del_filename}{type})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   829
                            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   830
                              print "File types for $del_filename and ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   831
                                    "$add_filename differ.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   832
                              $got_line = undef;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   833
                            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   834
                        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   835
                    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   836
                } until ($got_line);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   837
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   838
                if ($line !~ /^F$/i)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   839
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   840
                    print "Renaming $del_filename to $add_filename.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   841
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   842
                    $repeat_loop = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   843
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   844
                    # Because subversion cannot rename the same file
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   845
                    # or directory twice, which includes doing a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   846
                    # rename of a file in a directory that was
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   847
                    # previously renamed, a commit has to be
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   848
                    # performed.  Check if the file or directory being
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   849
                    # renamed now would cause such a problem and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   850
                    # commit if so.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   851
                    my $do_commit_now = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   852
                    foreach my $rename_to_filename (keys %rename_to_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   853
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   854
                        if (contained_in($del_filename,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   855
                                         $rename_to_filename,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   856
                                         $rename_to_files{$rename_to_filename}{type}))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   857
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   858
                            $do_commit_now = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   859
                            last;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   860
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   861
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   862
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   863
                    if ($do_commit_now)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   864
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   865
                        print "Now committing previously run renames.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   866
                        &commit_renames($load_dir,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   867
                                        \@renamed_filenames,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   868
                                        \%rename_from_files,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   869
                                        \%rename_to_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   870
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   871
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   872
                    push(@renamed_filenames, $del_filename, $add_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   873
                    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   874
                      my $d = $del_files{$del_filename};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   875
                      $rename_from_files{$del_filename} = $d;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   876
                      $rename_to_files{$add_filename}   = $d;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   877
                    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   878
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   879
                    # Check that any required directories to do the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   880
                    # rename exist.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   881
                    my @add_segments = split('/', $add_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   882
                    pop(@add_segments);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   883
                    my $add_dir = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   884
                    my @add_dirs;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   885
                    foreach my $segment (@add_segments)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   886
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   887
                        $add_dir = length($add_dir) ? "$add_dir/$segment" :
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   888
                                                      $segment;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   889
                        unless (-d $add_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   890
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   891
                            push(@add_dirs, $add_dir);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   892
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   893
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   894
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   895
                    if (@add_dirs)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   896
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   897
                        read_from_process($svn, 'mkdir', @add_dirs);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   898
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   899
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   900
                    read_from_process($svn, 'mv',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   901
                                      $del_filename, $add_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   902
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   903
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   904
          } while ($repeat_loop);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   905
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   906
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   907
    # If there are any renames that have not been committed, then do
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   908
    # that now.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   909
    if (@renamed_filenames)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   910
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   911
        &commit_renames($load_dir,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   912
                        \@renamed_filenames,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   913
                        \%rename_from_files,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   914
                        \%rename_to_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   915
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   916
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   917
    # At this point all renames have been performed.  Now get the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   918
    # final list of files and directories in the working copy
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   919
    # directory.  The %add_files hash will contain the list of files
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   920
    # and directories to add to the working copy and %del_files starts
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   921
    # with all the files already in the working copy and gets files
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   922
    # removed that are in the imported directory, which results in a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   923
    # list of files that should be deleted.  %upd_files holds the list
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   924
    # of files that have been updated.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   925
    my %add_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   926
    my %del_files = &recursive_ls_and_hash($wc_import_dir_cwd);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   927
    my %upd_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   928
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   929
    # This anonymous subroutine copies files from the source directory
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   930
    # to the working copy directory.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   931
    my $wanted = sub
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   932
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   933
        s#^\./##;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   934
        return if $_ eq '.';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   935
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   936
        my $source_path = $_;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   937
        my $dest_path   = "$wc_import_dir_cwd/$_";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   938
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   939
        my ($source_type, $source_is_exe) = &file_info($source_path);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   940
        my ($dest_type)                   = &file_info($dest_path);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   941
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   942
        return if ($source_type ne 'd' and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   943
                   $source_type ne 'f' and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   944
                   $source_type ne 'l');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   945
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   946
        # Fail if the destination type exists but is of a different
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   947
        # type of file than the source type.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   948
        if ($dest_type ne '0' and $source_type ne $dest_type)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   949
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   950
            die "$0: does not handle changing source and destination type ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   951
                "for '$source_path'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   952
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   953
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   954
        # Determine if the file is being added or is an update to an
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   955
        # already existing file using the file's digest.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   956
        my $del_info = delete $del_files{$source_path};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   957
        if (defined $del_info)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   958
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   959
            if (defined (my $del_digest = $del_info->{digest}))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   960
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   961
                my $new_digest = &digest_hash_file($source_path);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   962
                if ($new_digest ne $del_digest)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   963
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   964
                    print "U   $source_path\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   965
                    $upd_files{$source_path} = $del_info;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   966
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   967
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   968
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   969
        else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   970
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   971
            print "A   $source_path\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   972
            $add_files{$source_path}{type} = $source_type;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   973
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   974
            # Create an array reference to hold the list of properties
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   975
            # to apply to this object.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   976
            unless (defined $add_files{$source_path}{properties})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   977
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   978
                $add_files{$source_path}{properties} = [];
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   979
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   980
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   981
            # Go through the list of properties for a match on this
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   982
            # file or directory and if there is a match, then apply
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   983
            # the property to it.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   984
            foreach my $property (@property_settings)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   985
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   986
                my $re = $property->{re};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   987
                if ($source_path =~ $re)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   988
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   989
                    my $property_name  = $property->{name};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   990
                    my $property_value = $property->{value};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   991
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   992
                    # The property value may not be set in the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   993
                    # configuration file, since the user may just want
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   994
                    # to set the control flag.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   995
                    if (defined $property_name and defined $property_value)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   996
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   997
                        # Ignore properties that do not apply to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   998
                        # directories.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   999
                        if ($source_type eq 'd')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1000
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1001
                            if ($property_name eq 'svn:eol-style' or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1002
                                $property_name eq 'svn:executable' or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1003
                                $property_name eq 'svn:keywords' or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1004
                                $property_name eq 'svn:mime-type')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1005
                              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1006
                                next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1007
                              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1008
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1009
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1010
                        # Ignore properties that do not apply to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1011
                        # files.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1012
                        if ($source_type eq 'f')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1013
                          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1014
                            if ($property_name eq 'svn:externals' or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1015
                                $property_name eq 'svn:ignore')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1016
                              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1017
                                next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1018
                              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1019
                          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1020
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1021
                        print "Adding to '$source_path' property ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1022
                              "'$property_name' with value ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1023
                              "'$property_value'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1024
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1025
                        push(@{$add_files{$source_path}{properties}},
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1026
                             $property);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1027
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1028
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1029
                    last if $property->{control} eq 'break';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1030
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1031
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1032
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1033
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1034
        # Add svn:executable to files that have their executable bit
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1035
        # set.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1036
        if ($source_is_exe and !$opt_no_auto_exe)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1037
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1038
            print "Adding to '$source_path' property 'svn:executable' with ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1039
                  "value '*'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1040
            my $property = {name => 'svn:executable', value => '*'};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1041
            push (@{$add_files{$source_path}{properties}},
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1042
                  $property);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1043
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1044
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1045
        # Now make sure the file or directory in the source directory
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1046
        # exists in the repository.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1047
        if ($source_type eq 'd')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1048
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1049
            if ($dest_type eq '0')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1050
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1051
                mkdir($dest_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1052
                  or die "$0: cannot mkdir '$dest_path': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1053
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1054
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1055
        elsif
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1056
          ($source_type eq 'l') {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1057
            my $link_target = readlink($source_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1058
              or die "$0: cannot readlink '$source_path': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1059
            if ($dest_type eq 'l')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1060
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1061
                my $old_target = readlink($dest_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1062
                  or die "$0: cannot readlink '$dest_path': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1063
                return if ($old_target eq $link_target);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1064
                unlink($dest_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1065
                  or die "$0: unlink '$dest_path' failed: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1066
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1067
            symlink($link_target, $dest_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1068
              or die "$0: cannot symlink '$dest_path' to '$link_target': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1069
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1070
        elsif
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1071
          ($source_type eq 'f') {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1072
            # Only copy the file if the digests do not match.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1073
            if ($add_files{$source_path} or $upd_files{$source_path})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1074
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1075
                copy($source_path, $dest_path)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1076
                  or die "$0: copy '$source_path' to '$dest_path': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1077
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1078
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1079
        else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1080
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1081
            die "$0: does not handle copying files of type '$source_type'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1082
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1083
      };
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1084
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1085
    # Now change into the directory containing the files to load.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1086
    # First change to the original directory where this script was run
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1087
    # so that if the specified directory is a relative directory path,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1088
    # then the script can change into it.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1089
    chdir($orig_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1090
      or die "$0: cannot chdir '$orig_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1091
    chdir($load_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1092
      or die "$0: cannot chdir '$load_dir': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1093
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1094
    find({no_chdir   => 1,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1095
          preprocess => sub { sort { $b cmp $a }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1096
                              grep { $_ !~ /^[._]svn$/ } @_ },
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1097
          wanted     => $wanted
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1098
         }, '.');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1099
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1100
    # The files and directories that are in %del_files are the files
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1101
    # and directories that need to be deleted.  Because svn will
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1102
    # return an error if a file or directory is deleted in a directory
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1103
    # that subsequently is deleted, first find all directories and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1104
    # remove from the list any files and directories inside those
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1105
    # directories from this list.  Work through the list repeatedly
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1106
    # working from short to long names so that directories containing
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1107
    # other files and directories will be deleted first.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1108
    my $repeat_loop;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1109
    do
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1110
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1111
        $repeat_loop = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1112
        my @del_files = sort {length($a) <=> length($b) || $a cmp $b}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1113
                        keys %del_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1114
        &filter_renamed_files(\@del_files, \%rename_from_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1115
        foreach my $file (@del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1116
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1117
            if ($del_files{$file}{type} eq 'd')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1118
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1119
                my $dir        = "$file/";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1120
                my $dir_length = length($dir);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1121
                foreach my $f (@del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1122
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1123
                    next if $file eq $f;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1124
                    if (length($f) >= $dir_length and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1125
                        substr($f, 0, $dir_length) eq $dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1126
                      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1127
                        print "d   $f\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1128
                        delete $del_files{$f};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1129
                        $repeat_loop = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1130
                      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1131
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1132
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1133
                # If there were any deletions of files and/or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1134
                # directories inside a directory that will be deleted,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1135
                # then restart the entire loop again, because one or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1136
                # more keys have been deleted from %del_files.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1137
                # Equally important is not to stop this loop if no
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1138
                # deletions have been done, otherwise later
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1139
                # directories that may contain files and directories
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1140
                # to be deleted will not be deleted.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1141
                last if $repeat_loop;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1142
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1143
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1144
      } while ($repeat_loop);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1145
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1146
    # What is left are files that are not in any directories to be
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1147
    # deleted and directories to be deleted.  To delete the files,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1148
    # deeper files and directories must be deleted first.  Because we
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1149
    # have a hash keyed by remaining files and directories to be
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1150
    # deleted, instead of trying to figure out which directories and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1151
    # files are contained in other directories, just reverse sort by
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1152
    # the path length and then alphabetically.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1153
    my @del_files = sort {length($b) <=> length($a) || $a cmp $b }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1154
                    keys %del_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1155
    &filter_renamed_files(\@del_files, \%rename_from_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1156
    foreach my $file (@del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1157
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1158
        print "D   $file\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1159
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1160
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1161
    # Now change back to the trunk directory and run the svn commands.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1162
    chdir($wc_import_dir_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1163
      or die "$0: cannot chdir '$wc_import_dir_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1164
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1165
    # If any of the added files have the svn:eol-style property set,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1166
    # then pass -b to diff, otherwise diff may fail because the end of
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1167
    # lines have changed and the source file and file in the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1168
    # repository will not be identical.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1169
    my @diff_ignore_space_changes;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1170
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1171
    if (keys %add_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1172
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1173
        my @add_files = sort {length($a) <=> length($b) || $a cmp $b}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1174
                        keys %add_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1175
        my $target_filename = &make_targets_file(@add_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1176
        read_from_process($svn, 'add', '-N', '--targets', $target_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1177
        unlink($target_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1178
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1179
        # Add properties on the added files.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1180
        foreach my $add_file (@add_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1181
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1182
            foreach my $property (@{$add_files{$add_file}{properties}})
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1183
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1184
                my $property_name  = $property->{name};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1185
                my $property_value = $property->{value};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1186
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1187
                if ($property_name eq 'svn:eol-style')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1188
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1189
                    @diff_ignore_space_changes = ('-b');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1190
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1191
                
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1192
                # Write the value to a temporary file in case it's multi-line
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1193
                my ($handle, $tmpfile) = tempfile(DIR => $temp_dir);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1194
                print $handle $property_value;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1195
                close($handle);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1196
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1197
                read_from_process($svn,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1198
                                  'propset',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1199
                                  $property_name,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1200
                                  '--file',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1201
                                  $tmpfile,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1202
                                  $add_file);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1203
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1204
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1205
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1206
    if (@del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1207
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1208
        my $target_filename = &make_targets_file(@del_files);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1209
        read_from_process($svn, 'rm', '--targets', $target_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1210
        unlink($target_filename);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1211
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1212
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1213
    # Go through the list of updated files and check the svn:eol-style
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1214
    # property.  If it is set to native, then convert all CR, CRLF and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1215
    # LF's in the file to the native end of line characters.  Also,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1216
    # modify diff's command line so that it will ignore the change in
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1217
    # end of line style.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1218
    if (keys %upd_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1219
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1220
        my @upd_files = sort {length($a) <=> length($b) || $a cmp $b}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1221
                        keys %upd_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1222
        foreach my $upd_file (@upd_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1223
          {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1224
            # Always append @BASE to a filename in case they contain a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1225
            # @ character, in which case the Subversion command line
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1226
            # client will attempt to parse the characters after the @
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1227
            # as a revision and most likely fail, or if the characters
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1228
            # after the @ are a valid revision, then it'll possibly
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1229
            # get the incorrect information.  So always append @BASE
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1230
            # and any preceding @'s will be treated normally and the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1231
            # correct information will be retrieved.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1232
            my @command = ($svn,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1233
                           'propget',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1234
                           'svn:eol-style',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1235
                           "$upd_file\@BASE");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1236
            my @lines = read_from_process(@command);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1237
            next unless @lines;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1238
            if (@lines > 1)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1239
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1240
                warn "$0: '@command' returned more than one line of output: ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1241
                  "'@lines'.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1242
                next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1243
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1244
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1245
            my $eol_style = $lines[0];
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1246
            if ($eol_style eq 'native')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1247
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1248
                @diff_ignore_space_changes = ('-b');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1249
                if (&convert_file_to_native_eol($upd_file))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1250
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1251
                    print "Native eol-style conversion modified $upd_file.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1252
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1253
              }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1254
          }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1255
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1256
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1257
    my $message = wrap('', '', "Load $load_dir into $repos_load_abs_path.\n");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1258
    read_from_process($svn, 'commit',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1259
                      @svn_use_repos_cmd_opts,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1260
                      '-m', $message);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1261
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1262
    # If an update is not run now after a commit, then some file and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1263
    # directory paths will have an older revisions associated with
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1264
    # them and any future commits will fail because they are out of
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1265
    # date.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1266
    read_from_process($svn, 'update', @svn_use_repos_cmd_opts);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1267
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1268
    # Now remove any files and directories to be deleted in the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1269
    # repository.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1270
    if (@del_files)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1271
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1272
        rmtree(\@del_files, 1, 0);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1273
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1274
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1275
    # Now make the tag by doing a copy in the svn repository itself.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1276
    if (defined $load_tag)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1277
      {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1278
        my $repos_tag_abs_path = length($repos_base_path_segment) ?
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1279
                                 "$repos_base_path_segment/$load_tag" :
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1280
                                 $load_tag;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1281
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1282
        my $from_url = $repos_load_rel_path eq '.' ?
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1283
                       $repos_load_rel_path :
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1284
                       "$repos_base_url/$repos_load_rel_path";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1285
        my $to_url   = "$repos_base_url/$load_tag";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1286
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1287
        $message     = wrap("",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1288
                            "",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1289
                            "Tag $repos_load_abs_path as " .
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1290
                            "$repos_tag_abs_path.\n");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1291
        read_from_process($svn, 'cp', @svn_use_repos_cmd_opts,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1292
                          '-m', $message, $from_url, $to_url);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1293
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1294
        # Now check out the tag and run a recursive diff between the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1295
        # original source directory and the tag for a consistency
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1296
        # check.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1297
        my $checkout_dir_name = "my_tag_wc_named_$load_tag";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1298
        print "Checking out $to_url into $temp_dir/$checkout_dir_name\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1299
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1300
        chdir($temp_dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1301
          or die "$0: cannot chdir '$temp_dir': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1302
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1303
        read_from_process($svn, 'checkout',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1304
                          @svn_use_repos_cmd_opts,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1305
                          $to_url, $checkout_dir_name);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1306
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1307
        chdir($checkout_dir_name)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1308
          or die "$0: cannot chdir '$checkout_dir_name': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1309
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1310
        chdir($orig_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1311
          or die "$0: cannot chdir '$orig_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1312
        read_from_process('diff', '-u', @diff_ignore_space_changes,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1313
                          '-x', '.svn',
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1314
                          '-r', $load_dir, "$temp_dir/$checkout_dir_name");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1315
      }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1316
  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1317
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1318
exit 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1319
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1320
sub usage
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1321
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1322
  warn "@_\n" if @_;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1323
  die "usage: $0 [options] svn_url svn_import_dir [dir_v1 [dir_v2 [..]]]\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1324
      "  svn_url        is the file:// or http:// URL of the svn repository\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1325
      "  svn_import_dir is the path relative to svn_url where to load dirs\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1326
      "  dir_v1 ..      list dirs to import otherwise read from stdin\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1327
      "options are\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1328
      "  -no_user_input don't ask yes/no questions and assume yes answer\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1329
      "  -no_auto_exe   don't set svn:executable for executable files\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1330
      "  -p filename    table listing properties to apply to matching files\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1331
      "  -svn_username  username to perform commits as\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1332
      "  -svn_password  password to supply to svn commit\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1333
      "  -t tag_dir     create a tag copy in tag_dir, relative to svn_url\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1334
      "  -v             increase program verbosity, multiple -v's allowed\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1335
      "  -wc path       use the already checked-out working copy at path\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1336
      "                 instead of checkout out a fresh working copy\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1337
      "  -glob_ignores  List of filename patterns to ignore (as in svn's\n",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1338
      "                 global-ignores config option)\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1339
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1340
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1341
# Get the next directory to load, either from the command line or from
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1342
# standard input.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1343
my $get_next_load_dir_init = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1344
my @get_next_load_dirs;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1345
sub get_next_load_dir
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1346
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1347
  if (@ARGV)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1348
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1349
      unless ($get_next_load_dir_init)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1350
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1351
          $get_next_load_dir_init = 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1352
          @get_next_load_dirs     = @ARGV;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1353
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1354
      return shift @get_next_load_dirs;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1355
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1356
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1357
  if ($opt_verbose)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1358
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1359
      print "Waiting for next directory to import on standard input:\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1360
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1361
  my $line = <STDIN>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1362
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1363
  print "\n" if $opt_verbose;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1364
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1365
  chomp $line;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1366
  if ($line =~ m|(\S+)\s+(\S+)|)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1367
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1368
      $line = $1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1369
      set_svn_use_repos_cmd_opts($2, $opt_svn_password);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1370
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1371
  $line;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1372
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1373
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1374
# This constant stores the commonly used string to indicate that a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1375
# subroutine has been passed an incorrect number of arguments.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1376
use vars qw($INCORRECT_NUMBER_OF_ARGS);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1377
$INCORRECT_NUMBER_OF_ARGS = "passed incorrect number of arguments.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1378
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1379
# Creates a temporary file in the temporary directory and stores the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1380
# arguments in it for use by the svn --targets command line option.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1381
# If any part of the file creation failed, exit the program, as
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1382
# there's no workaround.  Use a unique number as a counter to the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1383
# files.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1384
my $make_targets_file_counter;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1385
sub make_targets_file
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1386
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1387
  unless (@_)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1388
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1389
      confess "$0: make_targets_file $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1390
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1391
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1392
  $make_targets_file_counter = 1 unless defined $make_targets_file_counter;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1393
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1394
  my $filename = sprintf "%s/targets.%05d",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1395
                 $temp_dir,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1396
                 $make_targets_file_counter;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1397
  ++$make_targets_file_counter;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1398
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1399
  open(TARGETS, ">$filename")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1400
    or die "$0: cannot open '$filename' for writing: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1401
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1402
  foreach my $file (@_)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1403
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1404
      print TARGETS "$file\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1405
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1406
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1407
  close(TARGETS)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1408
    or die "$0: error in closing '$filename' for writing: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1409
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1410
  $filename;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1411
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1412
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1413
# Set the svn command line options that are used anytime svn connects
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1414
# to the repository.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1415
sub set_svn_use_repos_cmd_opts
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1416
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1417
  unless (@_ == 2)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1418
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1419
      confess "$0: set_svn_use_repos_cmd_opts $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1420
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1421
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1422
  my $username = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1423
  my $password = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1424
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1425
  @svn_use_repos_cmd_opts = ('--non-interactive');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1426
  if (defined $username and length $username)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1427
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1428
      push(@svn_use_repos_cmd_opts, '--username', $username);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1429
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1430
  if (defined $password)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1431
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1432
      push(@svn_use_repos_cmd_opts, '--password', $password);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1433
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1434
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1435
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1436
sub get_tag_dir
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1437
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1438
  unless (@_ == 1)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1439
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1440
      confess "$0: get_tag_dir $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1441
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1442
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1443
  my $load_dir = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1444
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1445
  # Take the tag relative directory, search for pairs of
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1446
  # REGEX_SEP_CHAR's and use the regular expression inside the pair to
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1447
  # put in the tag directory name.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1448
  my $tag_location = $opt_import_tag_location;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1449
  my $load_tag     = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1450
  while ((my $i = index($tag_location, $REGEX_SEP_CHAR)) >= 0)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1451
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1452
      $load_tag .= substr($tag_location, 0, $i, '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1453
      substr($tag_location, 0, 1, '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1454
      my $j = index($tag_location, $REGEX_SEP_CHAR);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1455
      if ($j < 0)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1456
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1457
          die "$0: -t value '$opt_import_tag_location' does not have ",
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1458
              "matching $REGEX_SEP_CHAR.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1459
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1460
      my $regex = substr($tag_location, 0, $j, '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1461
      $regex = "($regex)" unless ($regex =~ /\(.+\)/);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1462
      substr($tag_location, 0, 1, '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1463
      my @results = $load_dir =~ m/$regex/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1464
      $load_tag .= join('', @results);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1465
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1466
  $load_tag .= $tag_location;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1467
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1468
  $load_tag;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1469
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1470
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1471
# Return a two element array.  The first element is a single character
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1472
# that represents the type of object the path points to.  The second
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1473
# is a boolean (1 for true, '' for false) if the path points to a file
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1474
# and if the file is executable.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1475
sub file_info
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1476
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1477
  lstat(shift) or return ('0', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1478
  -b _ and return ('b', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1479
  -c _ and return ('c', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1480
  -d _ and return ('d', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1481
  -f _ and return ('f', -x _);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1482
  -l _ and return ('l', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1483
  -p _ and return ('p', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1484
  -S _ and return ('S', '');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1485
  return '?';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1486
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1487
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1488
# Start a child process safely without using /bin/sh.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1489
sub safe_read_from_pipe
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1490
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1491
  unless (@_)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1492
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1493
      croak "$0: safe_read_from_pipe $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1494
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1495
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1496
  my $openfork_available = "MSWin32" ne $OSNAME;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1497
  if ($openfork_available)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1498
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1499
      print "Running @_\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1500
      my $pid = open(SAFE_READ, "-|");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1501
      unless (defined $pid)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1502
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1503
          die "$0: cannot fork: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1504
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1505
      unless ($pid)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1506
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1507
          # child
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1508
          open(STDERR, ">&STDOUT")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1509
            or die "$0: cannot dup STDOUT: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1510
          exec(@_)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1511
            or die "$0: cannot exec '@_': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1512
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1513
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1514
  else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1515
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1516
      # Redirect the comment into a temp file and use that to work around
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1517
      # Windoze's (non-)handling of multi-line commands.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1518
      my @commandline = ();
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1519
      my $command;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1520
      my $comment;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1521
        
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1522
      while ($command = shift)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1523
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1524
          if ("-m" eq $command)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1525
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1526
              my $comment = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1527
              my ($handle, $tmpfile) = tempfile(DIR => $temp_dir);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1528
              print $handle $comment;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1529
              close($handle);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1530
                
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1531
              push(@commandline, "--file");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1532
              push(@commandline, $tmpfile);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1533
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1534
          else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1535
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1536
              # Munge the command to protect it from the command line
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1537
              $command =~ s/\"/\\\"/g;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1538
              if ($command =~ m"\s") { $command = "\"$command\""; }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1539
              if ($command eq "") { $command = "\"\""; }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1540
              if ($command =~ m"\n")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1541
                {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1542
                  warn "$0: carriage return detected in command - may not work\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1543
                }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1544
              push(@commandline, $command);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1545
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1546
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1547
        
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1548
      print "Running @commandline\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1549
      if ( $comment ) { print $comment; }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1550
        
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1551
      # Now do the pipe.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1552
      open(SAFE_READ, "@commandline |")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1553
        or die "$0: cannot pipe to command: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1554
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1555
    
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1556
  # parent
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1557
  my @output;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1558
  while (<SAFE_READ>)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1559
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1560
      chomp;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1561
      push(@output, $_);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1562
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1563
  close(SAFE_READ);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1564
  my $result = $?;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1565
  my $exit   = $result >> 8;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1566
  my $signal = $result & 127;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1567
  my $cd     = $result & 128 ? "with core dump" : "";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1568
  if ($signal or $cd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1569
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1570
      warn "$0: pipe from '@_' failed $cd: exit=$exit signal=$signal\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1571
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1572
  if (wantarray)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1573
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1574
      return ($result, @output);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1575
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1576
  else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1577
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1578
      return $result;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1579
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1580
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1581
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1582
# Use safe_read_from_pipe to start a child process safely and exit the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1583
# script if the child failed for whatever reason.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1584
sub read_from_process
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1585
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1586
  unless (@_)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1587
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1588
      croak "$0: read_from_process $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1589
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1590
  my ($status, @output) = &safe_read_from_pipe(@_);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1591
  if ($status)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1592
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1593
      print STDERR "$0: @_ failed with this output:\n", join("\n", @output),
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1594
                   "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1595
      unless ($opt_no_user_input)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1596
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1597
          print STDERR
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1598
            "Press return to quit and clean up svn working directory: ";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1599
          <STDIN>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1600
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1601
      exit 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1602
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1603
  else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1604
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1605
      return @output;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1606
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1607
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1608
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1609
# Get a list of all the files and directories in the specified
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1610
# directory, the type of file and a digest hash of file types.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1611
sub recursive_ls_and_hash
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1612
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1613
  unless (@_ == 1)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1614
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1615
      croak "$0: recursive_ls_and_hash $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1616
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1617
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1618
  # This is the directory to change into.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1619
  my $dir = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1620
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1621
  # Get the current directory so that the script can change into the
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1622
  # current working directory after changing into the specified
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1623
  # directory.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1624
  my $return_cwd = cwd;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1625
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1626
  chdir($dir)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1627
    or die "$0: cannot chdir '$dir': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1628
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1629
  my %files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1630
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1631
  my $wanted = sub
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1632
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1633
      s#^\./##;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1634
      return if $_ eq '.';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1635
      my ($file_type) = &file_info($_);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1636
      my $file_digest;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1637
      if ($file_type eq 'f' or ($file_type eq 'l' and stat($_) and -f _))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1638
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1639
          $file_digest = &digest_hash_file($_);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1640
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1641
      $files{$_} = {type   => $file_type,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1642
                    digest => $file_digest};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1643
    };
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1644
  find({no_chdir   => 1,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1645
        preprocess => sub
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1646
	  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1647
            grep
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1648
              {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1649
                my $ok=1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1650
                foreach my $x (@glob_ignores)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1651
                  {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1652
                    if ( $_ =~ /$x/ ) {$ok=0;last;}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1653
                  }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1654
                $ok
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1655
              } @_
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1656
          },
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1657
        wanted     => $wanted
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1658
       }, '.');
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1659
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1660
  chdir($return_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1661
    or die "$0: cannot chdir '$return_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1662
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1663
  %files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1664
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1665
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1666
# Given a list of files and directories which have been renamed but
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1667
# not commtited, commit them with a proper log message.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1668
sub commit_renames
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1669
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1670
  unless (@_ == 4)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1671
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1672
      croak "$0: commit_renames $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1673
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1674
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1675
  my $load_dir          = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1676
  my $renamed_filenames = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1677
  my $rename_from_files = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1678
  my $rename_to_files   = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1679
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1680
  my $number_renames    = @$renamed_filenames/2;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1681
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1682
  my $message = "To prepare to load $load_dir into $repos_load_abs_path, " .
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1683
                "perform $number_renames rename" .
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1684
                ($number_renames > 1 ? "s" : "") . ".\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1685
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1686
  # Text::Wrap::wrap appears to replace multiple consecutive \n's with
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1687
  # one \n, so wrap the text and then append the second \n.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1688
  $message  = wrap("", "", $message) . "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1689
  while (@$renamed_filenames)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1690
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1691
      my $from  = "$repos_load_abs_path/" . shift @$renamed_filenames;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1692
      my $to    = "$repos_load_abs_path/" . shift @$renamed_filenames;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1693
      $message .= wrap("", "  ", "* $to: Renamed from $from.\n");
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1694
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1695
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1696
  # Change to the top of the working copy so that any
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1697
  # directories will also be updated.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1698
  my $cwd = cwd;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1699
  chdir($wc_import_dir_cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1700
    or die "$0: cannot chdir '$wc_import_dir_cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1701
  read_from_process($svn, 'commit', @svn_use_repos_cmd_opts, '-m', $message);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1702
  read_from_process($svn, 'update', @svn_use_repos_cmd_opts);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1703
  chdir($cwd)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1704
    or die "$0: cannot chdir '$cwd': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1705
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1706
  # Some versions of subversion have a bug where renamed files
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1707
  # or directories are not deleted after a commit, so do that
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1708
  # here.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1709
  my @del_files = sort {length($b) <=> length($a) || $a cmp $b }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1710
                  keys %$rename_from_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1711
  rmtree(\@del_files, 1, 0);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1712
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1713
  # Empty the list of old and new renamed names.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1714
  undef %$rename_from_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1715
  undef %$rename_to_files;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1716
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1717
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1718
# Take a one file or directory and see if its name is equal to a
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1719
# second or is contained in the second if the second file's file type
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1720
# is a directory.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1721
sub contained_in
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1722
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1723
  unless (@_ == 3)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1724
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1725
      croak "$0: contain_in $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1726
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1727
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1728
  my $contained      = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1729
  my $container      = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1730
  my $container_type = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1731
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1732
  if ($container eq $contained)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1733
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1734
      return 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1735
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1736
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1737
  if ($container_type eq 'd')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1738
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1739
      my $dirname        = "$container/";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1740
      my $dirname_length = length($dirname);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1741
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1742
      if ($dirname_length <= length($contained) and
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1743
          $dirname eq substr($contained, 0, $dirname_length))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1744
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1745
          return 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1746
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1747
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1748
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1749
  return 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1750
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1751
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1752
# Take an array reference containing a list of files and directories
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1753
# and take a hash reference and remove from the array reference any
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1754
# files and directories and the files the directory contains listed in
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1755
# the hash.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1756
sub filter_renamed_files
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1757
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1758
  unless (@_ == 2)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1759
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1760
      croak "$0: filter_renamed_files $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1761
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1762
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1763
  my $array_ref = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1764
  my $hash_ref  = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1765
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1766
  foreach my $remove_filename (keys %$hash_ref)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1767
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1768
      my $remove_file_type = $hash_ref->{$remove_filename}{type};
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1769
      for (my $i=0; $i<@$array_ref;)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1770
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1771
          if (contained_in($array_ref->[$i],
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1772
                           $remove_filename,
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1773
                           $remove_file_type))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1774
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1775
              splice(@$array_ref, $i, 1);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1776
              next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1777
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1778
          ++$i;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1779
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1780
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1781
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1782
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1783
# Get a digest hash of the specified filename.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1784
sub digest_hash_file
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1785
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1786
  unless (@_ == 1)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1787
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1788
      croak "$0: digest_hash_file $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1789
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1790
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1791
  my $filename = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1792
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1793
  my $ctx = Digest::MD5->new;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1794
  if (open(READ, $filename))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1795
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1796
      binmode READ;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1797
      $ctx->addfile(*READ);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1798
      close(READ);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1799
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1800
  else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1801
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1802
      die "$0: cannot open '$filename' for reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1803
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1804
  $ctx->digest;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1805
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1806
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1807
# Read standard input until a line contains the required input or an
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1808
# empty line to signify the default answer.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1809
sub get_answer
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1810
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1811
  unless (@_ == 3)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1812
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1813
      croak "$0: get_answer $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1814
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1815
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1816
  my $message = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1817
  my $answers = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1818
  my $def_ans = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1819
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1820
  return $def_ans if $opt_no_user_input;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1821
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1822
  my $char;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1823
  do
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1824
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1825
      print $message;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1826
      $char = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1827
      my $line = <STDIN>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1828
      if (defined $line and length $line)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1829
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1830
          $char = substr($line, 0, 1);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1831
          $char = '' if $char eq "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1832
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1833
    } until $char eq '' or $answers =~ /$char/ig;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1834
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1835
  return $def_ans if $char eq '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1836
  return pos($answers) - 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1837
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1838
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1839
# Determine the native end of line on this system by writing a \n in
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1840
# non-binary mode to an empty file and reading the same file back in
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1841
# binary mode.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1842
sub determine_native_eol
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1843
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1844
  my $filename = "$temp_dir/svn_load_dirs_eol_test.$$";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1845
  if (-e $filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1846
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1847
      unlink($filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1848
        or die "$0: cannot unlink '$filename': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1849
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1850
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1851
  # Write the \n in non-binary mode.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1852
  open(NL_TEST, ">$filename")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1853
    or die "$0: cannot open '$filename' for writing: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1854
  print NL_TEST "\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1855
  close(NL_TEST)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1856
    or die "$0: error in closing '$filename' for writing: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1857
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1858
  # Read the \n in binary mode.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1859
  open(NL_TEST, $filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1860
    or die "$0: cannot open '$filename' for reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1861
  binmode NL_TEST;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1862
  local $/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1863
  undef $/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1864
  my $eol = <NL_TEST>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1865
  close(NL_TEST)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1866
    or die "$0: cannot close '$filename' for reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1867
  unlink($filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1868
    or die "$0: cannot unlink '$filename': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1869
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1870
  my $eol_length = length($eol);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1871
  unless ($eol_length)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1872
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1873
      die "$0: native eol length on this system is 0.\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1874
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1875
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1876
  print "Native EOL on this system is ";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1877
  for (my $i=0; $i<$eol_length; ++$i)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1878
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1879
      printf "\\%03o", ord(substr($eol, $i, 1));
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1880
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1881
  print ".\n\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1882
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1883
  $eol;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1884
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1885
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1886
# Take a filename, open the file and replace all CR, CRLF and LF's
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1887
# with the native end of line style for this system.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1888
sub convert_file_to_native_eol
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1889
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1890
  unless (@_ == 1)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1891
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1892
      croak "$0: convert_file_to_native_eol $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1893
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1894
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1895
  my $filename = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1896
  open(FILE, $filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1897
    or die "$0: cannot open '$filename' for reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1898
  binmode FILE;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1899
  local $/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1900
  undef $/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1901
  my $in = <FILE>;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1902
  close(FILE)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1903
    or die "$0: error in closing '$filename' for reading: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1904
  my $out = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1905
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1906
  # Go through the file and transform it byte by byte.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1907
  my $i = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1908
  while ($i < length($in))
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1909
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1910
      my $cc = substr($in, $i, 2);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1911
      if ($cc eq "\015\012")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1912
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1913
          $out .= $native_eol;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1914
          $i += 2;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1915
          next;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1916
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1917
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1918
      my $c = substr($cc, 0, 1);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1919
      if ($c eq "\012" or $c eq "\015")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1920
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1921
          $out .= $native_eol;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1922
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1923
      else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1924
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1925
          $out .= $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1926
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1927
      ++$i;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1928
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1929
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1930
  return 0 if $in eq $out;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1931
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1932
  my $tmp_filename = ".svn/tmp/svn_load_dirs.$$";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1933
  open(FILE, ">$tmp_filename")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1934
    or die "$0: cannot open '$tmp_filename' for writing: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1935
  binmode FILE;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1936
  print FILE $out;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1937
  close(FILE)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1938
    or die "$0: cannot close '$tmp_filename' for writing: $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1939
  rename($tmp_filename, $filename)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1940
    or die "$0: cannot rename '$tmp_filename' to '$filename': $!\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1941
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1942
  return 1;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1943
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1944
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1945
# Split the input line into words taking into account that single or
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1946
# double quotes may define a single word with whitespace in it.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1947
sub split_line
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1948
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1949
  unless (@_ == 1)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1950
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1951
      croak "$0: split_line $INCORRECT_NUMBER_OF_ARGS";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1952
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1953
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1954
  my $line = shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1955
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1956
  # Strip leading whitespace.  Do not strip trailing whitespace which
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1957
  # may be part of quoted text that was never closed.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1958
  $line =~ s/^\s+//;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1959
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1960
  my $line_length  = length $line;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1961
  my @words        = ();
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1962
  my $current_word = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1963
  my $in_quote     = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1964
  my $in_protect   = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1965
  my $in_space     = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1966
  my $i            = 0;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1967
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1968
  while ($i < $line_length)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1969
    {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1970
      my $c = substr($line, $i, 1);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1971
      ++$i;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1972
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1973
      if ($in_protect)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1974
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1975
          if ($c eq $in_quote)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1976
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1977
              $current_word .= $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1978
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1979
          elsif ($c eq '"' or $c eq "'")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1980
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1981
              $current_word .= $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1982
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1983
          else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1984
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1985
              $current_word .= "$in_protect$c";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1986
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1987
          $in_protect = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1988
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1989
      elsif ($c eq '\\')
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1990
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1991
          $in_protect = $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1992
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1993
      elsif ($in_quote)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1994
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1995
          if ($c eq $in_quote)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1996
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1997
              $in_quote = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1998
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  1999
          else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2000
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2001
              $current_word .= $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2002
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2003
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2004
      elsif ($c eq '"' or $c eq "'")
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2005
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2006
          $in_quote = $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2007
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2008
      elsif ($c =~ m/^\s$/)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2009
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2010
          unless ($in_space)
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2011
            {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2012
              push(@words, $current_word);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2013
              $current_word = '';
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2014
            }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2015
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2016
      else
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2017
        {
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2018
          $current_word .= $c;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2019
        }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2020
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2021
      $in_space = $c =~ m/^\s$/;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2022
    }
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2023
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2024
  # Handle any leftovers.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2025
  $current_word .= $in_protect if $in_protect;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2026
  push(@words, $current_word) if length $current_word;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2027
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2028
  @words;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2029
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2030
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2031
# This package exists just to delete the temporary directory.
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2032
package Temp::Delete;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2033
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2034
sub new
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2035
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2036
  bless {}, shift;
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2037
}
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2038
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2039
sub DESTROY
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2040
{
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2041
  print "Cleaning up $temp_dir\n";
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2042
  File::Path::rmtree([$temp_dir], 0, 0);
b73eec62825a Remove last remnants of /thirdparty/.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
  2043
}