From svn-commits at oss.oracle.com Fri Apr 9 21:05:16 2004 From: svn-commits at oss.oracle.com (svn-commits@oss.oracle.com) Date: Fri Apr 9 20:05:17 2004 Subject: [Cvsman-commits] jlbec commits r30 - in trunk: . aix debian Message-ID: <200404100105.i3A15G9q025395@oss.oracle.com> Author: jlbec Date: 2004-04-09 20:05:13 -0500 (Fri, 09 Apr 2004) New Revision: 30 Modified: trunk/ChangeLog trunk/aix/ trunk/configure.in trunk/cvsman.in trunk/debian/changelog Log: 0.11.0 - perms and parent dirs Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2003-08-28 18:02:16 UTC (rev 29) +++ trunk/ChangeLog 2004-04-10 01:05:13 UTC (rev 30) @@ -1,3 +1,10 @@ +2004-04-09 Joel Becker + + * configure.in: 0.11.0 + * cvsman.in: Add parent directory creation and associated + .cvsperms work. + + 2003-05-09 Joel Becker * configure.in: Bump to 0.1.1 Property changes on: trunk/aix ___________________________________________________________________ Name: svn:ignore + calpg.cvsman.rte.inventory calpg.cvsman.rte.size Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2003-08-28 18:02:16 UTC (rev 29) +++ trunk/configure.in 2004-04-10 01:05:13 UTC (rev 30) @@ -2,7 +2,7 @@ AC_INIT(cvsman.in) -VERSION=0.10.1 +VERSION=0.11.0 AC_SUBST(VERSION) Modified: trunk/cvsman.in =================================================================== --- trunk/cvsman.in 2003-08-28 18:02:16 UTC (rev 29) +++ trunk/cvsman.in 2004-04-10 01:05:13 UTC (rev 30) @@ -70,6 +70,9 @@ And so on. +Parent directories will be created where they do not exist. Use the +.cvsperms mechanism to ensure permissions where needed. + A config file in the root collection directory called 'config' maintains the configuration for the cvsman application itself. The format is a simple : specification. The 'host' variable @@ -216,18 +219,21 @@ # User and group can be uid or logname. # Mode is in octal and do not require the leading 0. # -# Currently guaranteed that all files are regular files. -# sub load_perms { my $files = shift; + my $perms = {}; my $dirs = {}; -FL: foreach my $file (keys %{$files}) + my @traverse = keys %{$files}; + +FL: while (scalar(@traverse)) { + my $file = shift @traverse; my $dname = dirname($file); next FL if exists($dirs->{$dname}); + unshift @traverse, $dname; $dirs->{$dname} = 1; next FL unless open PERMHANDLE, "root$dname/.cvsperms"; @@ -242,7 +248,7 @@ my $gid = ($tgroup =~ /^\d+$/) ? $tgroup : getgrnam($tgroup); my $mode = sprintf("0%s", $rmode); - @{$files->{"$dname/$entry"}}{"uid","gid","mode"} = + @{$perms->{"$dname/$entry"}}{"uid", "gid", "mode"} = ($uid, $gid, $mode); # @@ -251,12 +257,14 @@ # as well. This includes files marked exclude. # This allows a script in the repository to be # 0700 but never installed anywhere. We force - # at least 0600 so that cvsman can still read/write - # the file. + # at least 0600 (0700 for directories) so that + # cvsman can still read/write the file. # - chown $uid, $gid, "root/$dname/$entry"; + chown $uid, $gid, "root$dname/$entry"; my $old_umask = umask 0000; - chmod((oct($mode) | 0600), + my $basemode = (-d "root$dname/$entry") ? + 0700 : 0600; + chmod((oct($mode) | $basemode), "root/$dname/$entry"); umask $old_umask; }; @@ -264,7 +272,7 @@ close PERMHANDLE; } - return 1; + return $perms; } # load_perms() @@ -528,14 +536,40 @@ # -# $rc install_file($file, $uid, $gid, $mode, $verbose) +# $rc install_file($file, $perms, $verbose) # # Installs the file, creating a backup. If the install fails, the # backup will be recovered. # sub install_file { - my ($file, $uid, $gid, $mode, $verbose) = @_; + my ($file, $perms, $verbose) = @_; + + my $permdir = dirname($file); + my @permtree; + while ($permdir ne "/") + { + # Yes, I could use split, but I prefer dirname to DTRT. + unshift @permtree, $permdir; + $permdir = dirname($permdir); + } + +PD: foreach my $permdir (@permtree) + { + next PD if -d $permdir; + if (-e $permdir) + { + printf STDERR "cvsman: Error: Path $permdir is not a directory!\n"; + return 0; + } + my $rc = mkdir $permdir, 0755; + if (!$rc) + { + printf STDERR "cvsman: Error: Unable to create path $permdir: $!\n"; + return 0; + } + } + if (-e "$file.cvsmansave") { if (-d "$file.cvsmansave") @@ -585,13 +619,18 @@ return 0; } - if (defined($uid)) + foreach my $permfile ($file, @permtree) { - chown $uid, $gid, $file; + my ($uid, $gid, $mode) = + @{$perms->{$permfile}}{"uid", "gid", "mode"}; + if (defined($uid)) + { + chown $uid, $gid, $permfile; - my $old_umask = umask 0000; - chmod oct($mode), $file; - umask $old_umask; + my $old_umask = umask 0000; + chmod oct($mode), $permfile; + umask $old_umask; + } } if ($verbose) @@ -635,7 +674,7 @@ my ($files, $cmds) = load_files($config); (defined($files) && defined($cmds)) or exit(1); -load_perms($files); +my $perms = load_perms($files); # Install files foreach my $file (keys %{$files}) @@ -653,9 +692,7 @@ else { install_file($file, - $files->{$file}{uid}, - $files->{$file}{gid}, - $files->{$file}{mode}, + $perms, $verbose); } } Modified: trunk/debian/changelog =================================================================== --- trunk/debian/changelog 2003-08-28 18:02:16 UTC (rev 29) +++ trunk/debian/changelog 2004-04-10 01:05:13 UTC (rev 30) @@ -1,3 +1,10 @@ +cvsman (0.11.0-1) unstable; urgency=low + + * Create parent directories for files + * Add parent directory searching for .cvsperms + + -- Joel Becker Fri, 09 Apr 2004 18:02:35 -0800 + cvsman (0.9.0-1) unstable; urgency=low * 'import' keyword From svn-commits at oss.oracle.com Fri Apr 9 21:32:49 2004 From: svn-commits at oss.oracle.com (svn-commits@oss.oracle.com) Date: Fri Apr 9 20:32:50 2004 Subject: [Cvsman-commits] jlbec commits r31 - tags Message-ID: <200404100132.i3A1WnOZ025504@oss.oracle.com> Author: jlbec Date: 2004-04-09 20:32:47 -0500 (Fri, 09 Apr 2004) New Revision: 31 Added: tags/cvsman-0.11.0/ Log: Tagging 0.11.0 Copied: tags/cvsman-0.11.0 (from rev 30, trunk)