This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
ecosadmin.tcl repository merge capability
- From: John Dallaway <jld at ecoscentric dot com>
- To: ecos-patches at sources dot redhat dot com
- Date: Thu, 12 Jun 2003 15:41:28 +0100
- Subject: ecosadmin.tcl repository merge capability
- Organization: eCosCentric Limited
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/ChangeLog,v
retrieving revision 1.110
diff -w -u -5 -r1.110 ChangeLog
--- ChangeLog 21 May 2003 18:43:42 -0000 1.110
+++ ChangeLog 12 Jun 2003 14:35:38 -0000
@@ -1,5 +1,10 @@
+2003-06-12 John Dallaway <jld@ecoscentric.com>
+
+ * ecosadmin.tcl: Add repository merge capability (undocumented and
+ unsupported at present).
+
2003-05-21 Jonathan Larmour <jifl@eCosCentric.com>
* pkgconf/stylesheet.dsl: No callout graphics.
2003-05-14 Thomas Koeller <thomas.koeller@baslerweb.com>
Index: ecosadmin.tcl
===================================================================
RCS file: /cvs/ecos/ecos/packages/ecosadmin.tcl,v
retrieving revision 1.13
diff -w -u -5 -r1.13 ecosadmin.tcl
--- ecosadmin.tcl 5 Mar 2003 16:41:26 -0000 1.13
+++ ecosadmin.tcl 12 Jun 2003 14:35:40 -0000
@@ -16,10 +16,11 @@
#===============================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+## Copyright (C) 2003 John Dallaway
##
## eCos is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free
## Software Foundation; either version 2 or (at your option) any later version.
##
@@ -120,10 +121,11 @@
variable list_packages_arg 0; # list
variable accept_license_arg 0; # --accept_license
variable extract_license_arg 0; # --extract_license
variable add_package ""; # add FILE
variable remove_package ""; # remove PACKAGE
+ variable merge_repository ""; # merge REPOSITORY
variable version_arg ""; # --version VER
# Details of all known packages, targets and templates
# read from the ecos.db file
variable known_packages ""
@@ -131,10 +133,13 @@
variable known_templates ""
array set package_data {};
array set target_data {};
array set template_data {};
+ # List of packages merged from another repository
+ variable merge_packages ""
+
# What routines should be invoked for outputting fatal errors and
# for warning messages ?
variable fatal_error_handler ecosadmin::cli_fatal_error
variable warning_handler ecosadmin::cli_warning
variable report_handler ecosadmin::cli_report
@@ -426,10 +431,24 @@
}
}
continue
}
+ # check for the merge command
+ if { [regexp -- {^-?-?merge=?(.*)$} $args($i) dummy match1] == 1 } {
+ if { $match1 != "" } {
+ set ecosadmin::merge_repository $match1
+ } else {
+ if { $i == $argc } {
+ fatal_error "missing argument after merge"
+ } else {
+ set ecosadmin::merge_repository $args([incr i])
+ }
+ }
+ continue
+ }
+
# check for the remove command
if { [regexp -- {^-?-?remove=?(.*)$} $args($i) dummy match1] == 1 } {
if { $match1 != "" } {
set ecosadmin::remove_package $match1
} else {
@@ -462,10 +481,11 @@
}
# Convert user-specified UNIX-style Cygwin pathnames to Windows Tcl-style as necessary
set ecosadmin::component_repository [get_pathname_for_tcl $ecosadmin::component_repository]
set ecosadmin::add_package [get_pathname_for_tcl $ecosadmin::add_package]
+ set ecosadmin::merge_repository [get_pathname_for_tcl $ecosadmin::merge_repository]
}
#
# Display help information if the user has typed --help, -H, --H, or -help.
# The help text uses two hyphens for consistency with configure.
@@ -481,11 +501,11 @@
}
# }}}
# {{{ Packages file
-proc ecosadmin::read_data { } {
+proc ecosadmin::read_data { silentflag } {
ASSERT { $ecosadmin::component_repository != "" }
set ecosadmin::known_packages ""
set ecosadmin::known_targets ""
@@ -614,21 +634,21 @@
# figure out which versions are present.
foreach pkg $ecosadmin::known_packages {
set pkgdir [file join $ecosadmin::component_repository $ecosadmin::package_data($pkg,dir)]
if { ![file exists $pkgdir] || ![file isdir $pkgdir] } {
+ if { "" == $silentflag } {
warning "package $pkg at $pkgdir missing"
+ }
} else {
-
# Each subdirectory should correspond to a release. A utility routine
# is available for this.
set ecosadmin::package_data($pkg,versions) [locate_subdirs $pkgdir]
if { $ecosadmin::package_data($pkg,versions) == "" } {
fatal_error "package $pkg has no version directories"
}
}
-
# Sort all the versions using a version-aware comparison version
set ecosadmin::package_data($pkg,versions) [
lsort -command ecosadmin::cdl_compare_version $ecosadmin::package_data($pkg,versions)
]
}
@@ -901,20 +921,28 @@
# open the eCos database file for appending
set ecosfile [ file join $ecosadmin::component_repository "ecos.db" ]
variable outfile [ open $ecosfile a+ ]
+ # initialize the list of merged packages
+ set ecosadmin::merge_packages ""
+
# this procedure is called when the interpreter encounters a
# package command in the datafile
proc merge { command name body } {
- ecosadmin::report "adding $command $name"
+ ecosadmin::report "processing $command $name"
# append the new package/target/template only if it is not already known
if { ( ( $command == "package" ) && ( [ lsearch -exact $ecosadmin::known_packages $name ] == -1 ) ) ||
( ( $command == "target" ) && ( [ lsearch -exact $ecosadmin::known_targets $name ] == -1 ) ) ||
( ( $command == "template" ) && ( [ lsearch -exact $ecosadmin::known_templates $name ] == -1 ) ) } {
puts $ecosadmin::outfile "$command $name {$body}\n"
}
+
+ # add new packages to the list of merged packages
+ if { ( "package" == $command ) } {
+ lappend ecosadmin::merge_packages $name
+ }
}
# Create the parser, add the aliased commands, and then define
# the routines that do the real work.
set parser [ interp create -safe ]
@@ -934,13 +962,12 @@
}
# The parser is ready to evaluate the script. To avoid having to give the
# safe interpreter file I/O capabilities, the file is actually read in
# here and then evaluated.
- set filename [ file join $ecosadmin::component_repository $datafile ]
set status [ catch {
- set fd [ open $filename r ]
+ set fd [ open $datafile r ]
set script [ read $fd ]
close $fd
$parser eval $script
} message ]
@@ -951,11 +978,11 @@
# close the eCos database file
close $outfile
# report errors
if { $status != 0 } {
- ecosadmin::fatal_error "parsing $filename:\n$message"
+ ecosadmin::fatal_error "parsing $datafile:\n$message"
}
}
#-----------------------------------------------------------------------
# Procedure filter_old_packages removes the specified packages/versions
@@ -1138,19 +1165,19 @@
}
}
}
# merge the new package information into the eCos database file as necessary
- ecosadmin::merge_new_packages $datafile
+ ecosadmin::merge_new_packages [ file join $ecosadmin::component_repository $datafile ]
# delete the database and license files
file delete $datafile
file delete $licensefile
# read the revised database back in and remove any
# targets and templates with missing packages
- read_data
+ read_data ""
filter_old_packages ""
}
# ----------------------------------------------------------------------------
# Process_remove_package. This routine is responsible for uninstalling a
@@ -1178,10 +1205,65 @@
# filter out the old package from the eCos database file
filter_old_packages $package_name
}
# ----------------------------------------------------------------------------
+# Process_merge_repository. This routine is responsible for merging packages
+# from another repository into the eCos repository
+#
+
+proc ecosadmin::process_merge_repository { } {
+ ASSERT { $ecosadmin::merge_repository != "" }
+ ASSERT { $ecosadmin::component_repository != "" }
+
+ # merge new package and target information into the eCos database file as necessary
+ # names of packages to be merged are placed in $ecosadmin::merge_packages
+ ecosadmin::merge_new_packages [ file join $ecosadmin::merge_repository "ecos.db" ]
+
+ # read the revised database back in to pick up new package paths, but ignore missing package directories
+ read_data "silent"
+
+ # copy package directories into the repository as necessary
+ # existing packages are never replaced but a another version may be added
+ foreach pkg $ecosadmin::merge_packages {
+ set newpkgdir [file join $ecosadmin::merge_repository $ecosadmin::package_data($pkg,dir)]
+ foreach newpkgver [locate_subdirs $newpkgdir] {
+ if { [lsearch $ecosadmin::package_data($pkg,versions) $newpkgver] == -1 } {
+ ecosadmin::report "copying $pkg $newpkgver"
+ file mkdir [ file join $ecosadmin::component_repository $ecosadmin::package_data($pkg,dir) ]
+ file copy [ file join $newpkgdir $newpkgver ] [ file join $ecosadmin::component_repository $ecosadmin::package_data($pkg,dir) $newpkgver ]
+ }
+ }
+ }
+
+ # read the revised database again to deliver warnings of missing package directories if necessary
+ read_data ""
+
+ # copy new files from the pkgconf and templates directory hierarchies into the repository as necessary
+ foreach topdir { pkgconf templates } {
+ set repository_files [ ecosadmin::locate_all_files [ file join $ecosadmin::component_repository $topdir ] ]
+ set merge_files [ ecosadmin::locate_all_files [ file join $ecosadmin::merge_repository $topdir ] ]
+ foreach filename $merge_files {
+ if { [lsearch $repository_files $filename] == -1 } {
+ ecosadmin::report "copying $topdir file $filename"
+ file mkdir [ file join $ecosadmin::component_repository $topdir [ file dirname $filename ] ]
+ file copy [ file join $ecosadmin::merge_repository $topdir $filename ] [ file join $ecosadmin::component_repository $topdir $filename ]
+ }
+ }
+ }
+
+ # copy files from the top level packages directory into the repository as necessary
+ foreach filename [ glob -nocomplain -directory $ecosadmin::merge_repository -type f * ] {
+ set destination [ file join $ecosadmin::component_repository [ file tail $filename ] ]
+ if { 0 == [ file exists $destination ] } {
+ ecosadmin::report "copying file [file tail $filename]"
+ file copy $filename $destination
+ }
+ }
+}
+
+# ----------------------------------------------------------------------------
# Accept_license. This routine is responsible for displaying the package
# license and obtaining user acceptance. It returns "y" if the license is
# accepted.
#
@@ -1242,21 +1324,23 @@
# Parse the arguments and set the global variables appropriately.
ecosadmin::parse_arguments $argv0 $argv
# Read in the eCos repository database.
- ecosadmin::read_data
+ ecosadmin::read_data ""
# Process the ecosadmin command
if { $ecosadmin::list_packages_arg != 0 } {
foreach pkg $ecosadmin::known_packages {
ecosadmin::report "$pkg: $ecosadmin::package_data($pkg,versions)"
}
} elseif { $ecosadmin::add_package != "" } {
ecosadmin::process_add_package
} elseif { $ecosadmin::remove_package != "" } {
ecosadmin::process_remove_package
+ } elseif { $ecosadmin::merge_repository != "" } {
+ ecosadmin::process_merge_repository
}
} error_message ] != 0 } {
# handle error message