home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume6 / makekits2 < prev    next >
Text File  |  1986-11-30  |  7KB  |  230 lines

  1. /* Written  9:35 am  Jun 18, 1986 by sources-request@mirror.UUCP in mirror:mod.sources */
  2. /* ---------- "v06i005:  makekits revisited (makek" ---------- */
  3. Submitted by: pyramid!tolerant!bene!luke!itkin
  4. Mod.sources: Volume 6, Issue 5
  5. Archive-name: makekits2
  6.  
  7. As the final header comment indicates, this is a modification of a script
  8. I posted a while back that includes the capability to traverse directories.
  9. It seems to work very well, and I am posting it in response to some discussion
  10. in net.sources.d about multi-part shar files.  I hope that it will satisfy the
  11. needs of those who have the problem.
  12.  
  13. [ I would be particularly interested in a /bin/sh or C version of
  14.   this that everyone could use.  I somehow think it would make my
  15.   job a little easier.  Steven's original version was posted in
  16.   mod.sources Vol2#16.  Note that this version supports up to 10
  17.   kits, or 640K of source; just barely big enough for hack.  --r$]
  18.  
  19. --------------------------------------------cut here-------------------
  20. # This is a shell archive.  Remove anything before this line,
  21. # then unpack it by saving it in a file and typing "sh file".
  22. echo x - makekits.csh
  23. sed 's/^XX//' > "makekits.csh" <<'@//E*O*F makekits.csh//'
  24. XX#! /bin/csh -f
  25. XX#
  26. XX# makekits - generate "kits" from source files for transmission across
  27. XX#  telephone lines.  Generates an output file called MANIFEST.  That
  28. XX#  file can be used by later executions of the program as the list of
  29. XX#  files.
  30. XX#
  31. XX#  usage: makekits [ -cMt ] [ -m manifest ]
  32. XX#                   [ -s size ] -k kitname [ files... ]
  33. XX#
  34. XX# note that to do directory traversal, you MUST include the name of
  35. XX#  the root directory in the list of file names.  In fact, the simplest
  36. XX#  way to do it is JUST to include the root name as the list of files.
  37. XX#
  38. XX# for example, to traverse the current tree and put all regular files
  39. XX#  in the kits:  "makekits -c -t /usr/local/src/abc"
  40. XX#
  41. XX# a short tutorial:
  42. XX#  first, if there is a file named MANIFEST, remove it
  43. XX#    if you are using a manifest, and it is named MANIFEST, change it
  44. XX#  second, DO NOT create your kits in the same directory as those
  45. XX#    files that are going into the kits, otherwise the kits will be
  46. XX#    in the kits will be in the kits will...
  47. XX#
  48. XX#  change directory to the directory (or root of the directories) containing
  49. XX#    the files to be placed in kits
  50. XX#
  51. XX#  execute the command "makekits -k /tmp/kit *" to pick up only plain
  52. XX#    files
  53. XX#
  54. XX#  execute the command "makekits -t -k /tmp/kit -s 124 *" to pick up all
  55. XX#    files in the current directory and all subdirectories.  this will
  56. XX#    cause the creation of a kit numbered zero (0) that will do nothing
  57. XX#    but create directories.
  58. XX#
  59. XX#--------------------------------------------------------------------------
  60. XX# this script updated 04/18/86 based on a cry for help on the network from
  61. XX#   Alan Clegg (...!mcnc!ncsu!ncsuvx!abc) to handle directories
  62. XX#--------------------------------------------------------------------------
  63. XX#  Steven List @ Benetics Corporation, Mt. View, CA
  64. XX#  {cdp,engfocus,idi,oliveb,plx,tolerant}!bene!luke!itkin
  65. XX#--------------------------------------------------------------------------
  66. XX#
  67. XXset COMPRESS = cat    # if -c, set to the local compression program
  68. XXset KITSIZE = 62    # leave room for the shar stuff
  69. XXset KITNAME = ""    # either from command line or requested below
  70. XXset MAN_NAME = ""    # may be set from the command line
  71. XXset MAX_KITS = 20    # limit the number of kits
  72. XXset TRAVERSE = 0    # if -t, traverse all directory trees found
  73. XX#
  74. XX# process command line arguments
  75. XX#
  76. XXforeach i ( $* )
  77. XX    switch ($1)
  78. XX        case -c:
  79. XX            set COMPRESS = /usr/lib/news/compress
  80. XX            set KITSIZE = 100
  81. XX            shift
  82. XX            breaksw
  83. XX        case -k:
  84. XX            set KITNAME = $2
  85. XX            shift; shift
  86. XX            breaksw
  87. XX        case -m:
  88. XX            set MAN_NAME = $2
  89. XX            shift; shift
  90. XX            breaksw
  91. XX        case -M:
  92. XX            set MAN_NAME = MANIFEST
  93. XX            shift
  94. XX            breaksw
  95. XX        case -s:
  96. XX            set KITSIZE = $2
  97. XX            shift; shift
  98. XX            breaksw
  99. XX        case -t:
  100. XX            set TRAVERSE = 1
  101. XX            shift
  102. XX            breaksw
  103. XX        case -*:
  104. XX    echo "usage: makekits [-cMt ][-m manifest][-s size] -k kitname [files...]"
  105. XX            exit (1)
  106. XX            breaksw
  107. XX        default:
  108. XX            break
  109. XX            breaksw
  110. XX    endsw
  111. XXend
  112. XX#
  113. XXif ( "$KITNAME" == "" ) then
  114. XX    echo "kitname is required"
  115. XX    echo "usage: makekits [-cMt ][-m manifest][-s size] -k kitname [files...]"
  116. XX    exit (2)
  117. XXendif
  118. XX#
  119. XXset SIZE = ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  120. XXset FILES = ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' )
  121. XX#
  122. XXswitch ("$MAN_NAME")
  123. XX    case MANIFEST:
  124. XX        set argv = ( `sed 1,2d MANIFEST | awk '{print $1}'` )
  125. XX        mv MANIFEST MANIFEST.bu
  126. XX        breaksw
  127. XX    case "":
  128. XX        breaksw
  129. XX    default:
  130. XX        set argv = ( `cat $MAN_NAME` )
  131. XX        breaksw
  132. XXendsw
  133. XX#
  134. XXset FLIST = ( "" )
  135. XXset DIRS = ( "" )
  136. XX######################################################################
  137. XX#
  138. XX# first, if specified, traverse all directories and add their file
  139. XX# names to the list of files
  140. XX#
  141. XXif ( $TRAVERSE ) then
  142. XX    foreach file ( $* )
  143. XX        if ( -d $file ) then
  144. XX            set DIRS = ( $DIRS `find $file -type d -print` )
  145. XX        else if ( -r $file ) then
  146. XX            set FLIST = ( $FLIST $file )
  147. XX        endif
  148. XX    end
  149.  
  150. XX    set BASE = `pwd`
  151. XX    foreach dir ( $DIRS )
  152. XX        cd $dir
  153. XX        foreach subfile ( * )
  154. XX            if ( -f $subfile ) set FLIST = ( $FLIST $dir/$subfile )
  155. XX        end
  156. XX        cd $BASE
  157. XX    end
  158. XXelse
  159. XX    FLIST = ( $* )
  160. XXendif
  161. XX            
  162. XXecho > MANIFEST
  163.  
  164. XXforeach file ( $FLIST MANIFEST )
  165. XX    if ( -d $file ) continue
  166. XX    set thissize = ( `ls -s $file` )
  167. XX    set thissize = $thissize[1]
  168. XX    set kit = 0
  169. XX    while ( $kit < $MAX_KITS )
  170. XX        @ kit++
  171. XX        if ( ( $SIZE[$kit] + $thissize ) <= $KITSIZE ) then
  172. XX            set FILES[$kit] = "$FILES[$kit] $file"
  173. XX            @ SIZE[$kit] += $thissize
  174. XX            echo "$file $kit" >> MANIFEST
  175. XX            break
  176. XX        endif
  177. XX    end
  178. XXend
  179. XX#
  180. XXsort -o MANIFEST MANIFEST
  181. XXawk '\
  182. XXBEGIN { print "File Name                 Kit Number"\
  183. XX        print "--------------            ----------"\
  184. XX        }\
  185. XX{ printf "%-24s     %d\n", $1, $2 }' MANIFEST  > tmp$$ 
  186. XXmv tmp$$ MANIFEST
  187. XX######################################################################
  188. XX#
  189. XX# make a kit to create the directories, if necessary
  190. XX#
  191. XXif ( "$DIRS" != "" ) then
  192. XX    echo "Creating KIT 0 to make directories"
  193. XX    cat > ${KITNAME}0 << EndHead
  194. XX#! /bin/sh
  195. XX# This is a shell archive, meaning:
  196. XX# 1. Remove everything above the #! /bin/sh line.
  197. XX# 2. Save the resulting text in a file.
  198. XX# 3. Execute the file with /bin/sh (not csh) to create the directories:
  199. XXEndHead
  200. XX    foreach i ( $DIRS )
  201. XX        echo "#   $i" >> ${KITNAME}0
  202. XX    end
  203. XX    echo "# This archive created: `date`" >> ${KITNAME}0
  204. XX    echo 'export PATH; PATH=/bin:$PATH' >> ${KITNAME}0
  205. XX    foreach i ( $DIRS )
  206. XX        cat >> ${KITNAME}0 << EndDIR
  207. XXif test ! -d '$i'
  208. XXthen
  209. XX    echo shar: creating directory "'$i'"
  210. XX    mkdir '$i'
  211. XXfi
  212. XXEndDIR
  213. XX    end
  214. XX    echo "#    End of shell archive" >> ${KITNAME}0
  215. XX    echo "Completed KIT 0"
  216. XXendif
  217. XX######################################################################
  218. XXforeach i ( 1 2 3 4 5 6 7 8 9 10 )
  219. XX    if ( $SIZE[$i] == 0 ) break
  220. XX    set NFILES = ( $FILES[$i] )
  221. XX    echo "Creating KIT $i ($KITNAME$i) - $#NFILES files, $SIZE[$i] blocks"
  222. XX    shar -p'XX#' -c -v $FILES[$i] | $COMPRESS > $KITNAME$i
  223. XX    echo "Completed KIT $i ($KITNAME$i)"
  224. XXend
  225. @//E*O*F makekits.csh//
  226. chmod u=rw,g=rw,o=rw xxx
  227.  
  228. exit 0
  229. /* End of text from mirror:mod.sources */
  230.