Merge branch 'fixes/md5' of git://github.com/epfl-scitas/spack into epfl-scitas-fixes/md5
This commit is contained in:
commit
747855b960
@ -22,23 +22,18 @@
|
|||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import argparse
|
import argparse
|
||||||
import hashlib
|
import hashlib
|
||||||
from pprint import pprint
|
|
||||||
from subprocess import CalledProcessError
|
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
from llnl.util.tty.colify import colify
|
|
||||||
|
|
||||||
import spack
|
import spack
|
||||||
import spack.cmd
|
import spack.cmd
|
||||||
import spack.util.crypto
|
import spack.util.crypto
|
||||||
from spack.stage import Stage, FailedDownloadError
|
from spack.stage import Stage, FailedDownloadError
|
||||||
from spack.version import *
|
from spack.version import *
|
||||||
|
|
||||||
description ="Checksum available versions of a package."
|
description = "Checksum available versions of a package."
|
||||||
|
|
||||||
|
|
||||||
def setup_parser(subparser):
|
def setup_parser(subparser):
|
||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
@ -60,30 +55,24 @@ def get_checksums(versions, urls, **kwargs):
|
|||||||
hashes = []
|
hashes = []
|
||||||
i = 0
|
i = 0
|
||||||
for url, version in zip(urls, versions):
|
for url, version in zip(urls, versions):
|
||||||
stage = Stage(url)
|
|
||||||
try:
|
try:
|
||||||
stage.fetch()
|
with Stage(url) as stage:
|
||||||
if i == 0 and first_stage_function:
|
stage.delete_on_exit = not keep_stage
|
||||||
first_stage_function(stage)
|
stage.fetch()
|
||||||
|
if i == 0 and first_stage_function:
|
||||||
|
first_stage_function(stage)
|
||||||
|
|
||||||
hashes.append((version,
|
hashes.append((version,
|
||||||
spack.util.crypto.checksum(hashlib.md5, stage.archive_file)))
|
spack.util.crypto.checksum(hashlib.md5, stage.archive_file)))
|
||||||
except FailedDownloadError, e:
|
i += 1
|
||||||
|
except FailedDownloadError as e:
|
||||||
tty.msg("Failed to fetch %s" % url)
|
tty.msg("Failed to fetch %s" % url)
|
||||||
continue
|
except Exception as e:
|
||||||
except Exception, e:
|
|
||||||
tty.msg('Something failed on %s, skipping.\n (%s)' % (url, e))
|
tty.msg('Something failed on %s, skipping.\n (%s)' % (url, e))
|
||||||
continue
|
|
||||||
|
|
||||||
finally:
|
|
||||||
if not keep_stage:
|
|
||||||
stage.destroy()
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
return hashes
|
return hashes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def checksum(parser, args):
|
def checksum(parser, args):
|
||||||
# get the package we're going to generate checksums for
|
# get the package we're going to generate checksums for
|
||||||
pkg = spack.repo.get(args.package)
|
pkg = spack.repo.get(args.package)
|
||||||
@ -106,8 +95,8 @@ def checksum(parser, args):
|
|||||||
|
|
||||||
tty.msg("Found %s versions of %s" % (len(versions), pkg.name),
|
tty.msg("Found %s versions of %s" % (len(versions), pkg.name),
|
||||||
*spack.cmd.elide_list(
|
*spack.cmd.elide_list(
|
||||||
["%-10s%s" % (v, versions[v]) for v in sorted_versions]))
|
["%-10s%s" % (v, versions[v]) for v in sorted_versions]))
|
||||||
print
|
print()
|
||||||
archives_to_fetch = tty.get_number(
|
archives_to_fetch = tty.get_number(
|
||||||
"How many would you like to checksum?", default=5, abort='q')
|
"How many would you like to checksum?", default=5, abort='q')
|
||||||
|
|
||||||
|
@ -22,51 +22,51 @@
|
|||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
import os
|
|
||||||
import argparse
|
import argparse
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import os
|
||||||
from contextlib import contextmanager
|
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
from llnl.util.filesystem import *
|
|
||||||
|
|
||||||
import spack.util.crypto
|
import spack.util.crypto
|
||||||
from spack.stage import Stage, FailedDownloadError
|
from spack.stage import Stage, FailedDownloadError
|
||||||
|
|
||||||
description = "Calculate md5 checksums for files/urls."
|
description = "Calculate md5 checksums for files/urls."
|
||||||
|
|
||||||
@contextmanager
|
|
||||||
def stager(url):
|
|
||||||
_cwd = os.getcwd()
|
|
||||||
_stager = Stage(url)
|
|
||||||
try:
|
|
||||||
_stager.fetch()
|
|
||||||
yield _stager
|
|
||||||
except FailedDownloadError:
|
|
||||||
tty.msg("Failed to fetch %s" % url)
|
|
||||||
finally:
|
|
||||||
_stager.destroy()
|
|
||||||
os.chdir(_cwd) # the Stage class changes the current working dir so it has to be restored
|
|
||||||
|
|
||||||
def setup_parser(subparser):
|
def setup_parser(subparser):
|
||||||
setup_parser.parser = subparser
|
setup_parser.parser = subparser
|
||||||
subparser.add_argument('files', nargs=argparse.REMAINDER,
|
subparser.add_argument('files', nargs=argparse.REMAINDER,
|
||||||
help="Files to checksum.")
|
help="Files to checksum.")
|
||||||
|
|
||||||
|
|
||||||
|
def compute_md5_checksum(url):
|
||||||
|
if not os.path.isfile(url):
|
||||||
|
with Stage(url) as stage:
|
||||||
|
stage.fetch()
|
||||||
|
value = spack.util.crypto.checksum(hashlib.md5, stage.archive_file)
|
||||||
|
else:
|
||||||
|
value = spack.util.crypto.checksum(hashlib.md5, url)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
def md5(parser, args):
|
def md5(parser, args):
|
||||||
if not args.files:
|
if not args.files:
|
||||||
setup_parser.parser.print_help()
|
setup_parser.parser.print_help()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
for f in args.files:
|
results = []
|
||||||
if not os.path.isfile(f):
|
for url in args.files:
|
||||||
with stager(f) as stage:
|
try:
|
||||||
checksum = spack.util.crypto.checksum(hashlib.md5, stage.archive_file)
|
checksum = compute_md5_checksum(url)
|
||||||
print "%s %s" % (checksum, f)
|
results.append((checksum, url))
|
||||||
else:
|
except FailedDownloadError as e:
|
||||||
if not can_access(f):
|
tty.warn("Failed to fetch %s" % url)
|
||||||
tty.die("Cannot read file: %s" % f)
|
tty.warn("%s" % e)
|
||||||
|
except IOError as e:
|
||||||
|
tty.warn("Error when reading %s" % url)
|
||||||
|
tty.warn("%s" % e)
|
||||||
|
|
||||||
checksum = spack.util.crypto.checksum(hashlib.md5, f)
|
# Dump the MD5s at last without interleaving them with downloads
|
||||||
print "%s %s" % (checksum, f)
|
tty.msg("Number of MD5 check-sums computed: %s " % len(results))
|
||||||
|
for checksum, url in results:
|
||||||
|
tty.msg("%s %s" % (checksum, url))
|
||||||
|
@ -50,4 +50,6 @@ def stage(parser, args):
|
|||||||
specs = spack.cmd.parse_specs(args.specs, concretize=True)
|
specs = spack.cmd.parse_specs(args.specs, concretize=True)
|
||||||
for spec in specs:
|
for spec in specs:
|
||||||
package = spack.repo.get(spec)
|
package = spack.repo.get(spec)
|
||||||
package.do_stage()
|
with package.stage as stage:
|
||||||
|
stage.delete_on_exit = False
|
||||||
|
package.do_stage()
|
||||||
|
@ -441,6 +441,7 @@ def __enter__(self):
|
|||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
for item in reversed(self):
|
for item in reversed(self):
|
||||||
|
item.delete_on_exit = getattr(self, 'delete_on_exit', True)
|
||||||
item.__exit__(exc_type, exc_val, exc_tb)
|
item.__exit__(exc_type, exc_val, exc_tb)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user