1
0
mirror of https://github.com/wfjm/w11.git synced 2026-04-20 02:32:56 +00:00
Files
wfjm.w11/tools/bin/svn_set_ignore
2019-08-02 23:34:18 +02:00

144 lines
3.9 KiB
Perl
Executable File

#!/usr/bin/perl -w
# $Id: svn_set_ignore 1189 2019-07-13 16:41:07Z mueller $
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright 2007-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# Revision History:
# Date Rev Vers Comment
# 2019-07-13 1189 1.2.3 drop superfluous exists for $opts
# 2018-12-18 1089 1.2.2 add and use bailout
# 2017-05-27 899 1.2.1 check svn:ignore existance before reading it
# 2016-12-17 821 1.2 use .gitignore rather .cvsignore
# 2014-11-04 601 1.1 use 'svn info' rather /.svn check for svn >= 1.7
# 2010-04-26 284 1.0.1 add error check for GetOptions
# 2007-06-16 56 1.0 Initial version
#
use 5.14.0; # require Perl 5.14 or higher
use strict; # require strict checking
use Getopt::Long;
my @dirlist;
my %ignores;
my %opts = ();
GetOptions(\%opts, "trace", "dry-run")
or bailout("bad command options");
if (@ARGV) {
push @dirlist, @ARGV;
} else {
@dirlist = `find -type d | sort`;
bailout("bad find|grep") if $?;
chomp @dirlist;
# drop some directories at this level
@dirlist = grep {! /\/(\.svn|\.Xil)/} @dirlist;
}
foreach (@dirlist) { do_dir($_); }
#-------------------------------------------------------------------------------
sub do_dir {
my ($dirname) = @_;
my @cur_ipat;
my @new_ipat;
my %ipat;
# skip ise directories (they have sometimes strange chars in dir names
return if $dirname =~ m|/ise/|;
# check for svn working directory
my $svn_info = `svn info $dirname 2>&1`;
return if $?;
print "$dirname\n";
my @dpelist = split '/', $dirname;
my @dpecurr = ();
foreach my $e (@dpelist) {
push @dpecurr, $e;
my $d = join '/',@dpecurr;
if (not exists $ignores{$d}) {
$ignores{$d} = ();
if (-r "$d/.gitignore") {
print "read $d/.gitignore\n" if $opts{trace};
open (CVSIG, "$d/.gitignore")
or bailout("failed to read '$d/.gitignore': $!");
while (<CVSIG>) {
chomp;
next if /^\s*$/; # ignore empty or space only lines
next if /^#/; # ignore comments
push @{$ignores{$d}}, $_;
print " $_\n" if $opts{trace};
}
close (CVSIG);
}
}
foreach my $i (@{$ignores{$d}}) {
next if exists $ipat{$i};
$ipat{$i} = 1;
push @new_ipat, $i;
}
}
# check whether svn:ignore already defined
my $has_ignore = 0;
open (SVN, "svn pl $dirname|")
or bailout("failed to open svn pl pipe for '$dirname': $!");
while (<SVN>) {
chomp;
if (m/^\s*svn:ignore\s*$/) {
$has_ignore = 1;
last;
}
}
close (SVN);
# read svn:ignore, if it exists
if ($has_ignore) {
open (SVN, "svn pg svn:ignore $dirname|")
or bailout("failed to open svn pg pipe for '$dirname': $!");
while (<SVN>) {
chomp;
next if /^\s*$/; # ignore empty or space only lines
push @cur_ipat, $_;
}
close (SVN);
}
if (join("\n",@cur_ipat) ne join("\n",@new_ipat)) {
if ($has_ignore) {
print "update svn:ignore for $dirname\n";
print "old svn:ignore:\n";
print " ", join("\n ",@cur_ipat),"\n";
} else {
print "setup svn:ignore for $dirname\n";
}
print "new svn:ignore:\n";
print " ", join("\n ",@new_ipat),"\n";
if (not $opts{"dry-run"}) {
open (TMP, ">/tmp/svn_set_ignore_$$")
or bailout("failed to open tmp file: $1");
print TMP join("\n",@new_ipat),"\n";
close (TMP);
print `svn ps svn:ignore -F /tmp/svn_set_ignore_$$ $dirname`;
bailout("bad svn ps") if $?;
unlink "/tmp/svn_set_ignore_$$"
or bailout("failed to delete tmp file: $!");
}
}
}
#-------------------------------------------------------------------------------
sub bailout {
my ($msg) = @_;
print STDERR "svn_set_ignore-F: $msg\n";
exit 1;
}