Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

https://codeberg.org/gnuastro/papers
06 December 2023, 14:06:29 UTC
  • Code
  • Branches (3)
  • Releases (0)
  • Visits
    • Branches
    • Releases
    • HEAD
    • refs/heads/maneage
    • refs/heads/pointing-simulate
    • refs/heads/zeropoint
    No releases to show
  • 8a3a871
  • /
  • reproduce
  • /
  • analysis
  • /
  • bash
  • /
  • download-multi-try
Raw File Download Save again
Take a new snapshot of a software origin

If the archived software origin currently browsed is not synchronized with its upstream version (for instance when new commits have been issued), you can explicitly request Software Heritage to take a new snapshot of it.

Use the form below to proceed. Once a request has been submitted and accepted, it will be processed as soon as possible. You can then check its processing state by visiting this dedicated page.
swh spinner

Processing "take a new snapshot" request ...

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
  • revision
  • snapshot
origin badgecontent badge
swh:1:cnt:d7e9be2da85f3c6471909fc0f876f82aaf1bc694
origin badgedirectory badge
swh:1:dir:5ca9a003d7374bdffe518be67ee38be8e9c0419a
origin badgerevision badge
swh:1:rev:8161194d68665648b93389adb333e741ba230497
origin badgesnapshot badge
swh:1:snp:e37e226bab517eef24d854467682b2fcf5d7dc32

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
  • directory
  • revision
  • snapshot
(requires biblatex-software package)
Generating citation ...
(requires biblatex-software package)
Generating citation ...
(requires biblatex-software package)
Generating citation ...
(requires biblatex-software package)
Generating citation ...
Tip revision: 8161194d68665648b93389adb333e741ba230497 authored by Mohammad Akhlaghi on 22 May 2023, 22:44:20 UTC
Configuration: portability fixes in Less and WCSLIB
Tip revision: 8161194
download-multi-try
#!/bin/sh
#
# Attempt downloading multiple times before crashing whole project. From
# the top project directory (for the shebang above), this script must be
# run like this:
#
#   $ /path/to/download-multi-try downloader lockfile input-url downloaded-name
#
# NOTE: The 'downloader' must contain the option to specify the output name
# in its end. For example "wget -O". Any other option can also be placed in
# the middle.
#
# Due to temporary network problems, a download may fail suddenly, but
# succeed in a second try a few seconds later. Without this script that
# temporary glitch in the network will permanently crash the project and
# it can't continue. The job of this script is to be patient and try the
# download multiple times before crashing the whole project.
#
# LOCK FILE: Since there is usually only one network port to the outside
# world, downloading is done much faster in serial, not in parallel. But
# the project's processing may be done in parallel (with multiple threads
# needing to download different files at the same time). Therefore, this
# script uses the 'flock' program to only do one download at a time. To
# benefit from it, any call to this script must be given the same lock
# file. If your system has multiple ports to the internet, or for any
# reason, you don't want to use a lock file, set the 'lockfile' name to
# 'nolock'.
#
# Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
#
# This program 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 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.





# Script settings
# ---------------
# Stop the script if there are any errors.
set -e





# Input arguments and necessary sanity checks. Note that the 5th argument
# (backup servers) isn't mandatory.
inurl="$3"
outname="$4"
lockfile="$2"
downloader="$1"
backupservers="$5"
if [ "x$downloader" = x ]; then
    echo "$0: downloader (first argument) not given."; exit 1;
fi
if [ "x$lockfile" = x ]; then
    echo "$0: lock file (second argument) not given."; exit 1;
fi
if [ "x$inurl" = x ]; then
    echo "$0: full input URL (third argument) not given."; exit 1;
fi
if [ "x$outname" = x ]; then
    echo "$0: output name (fourth argument) not given."; exit 1;
fi





# Separate the actual filename, to possibly use backup server.
urlfile=$(echo "$inurl" | awk -F "/" '{print $NF}')





# Try downloading multiple times before crashing.
counter=0
maxcounter=10
while [ ! -f "$outname" ]; do

    # Increment the counter.
    counter=$(echo $counter | awk '{print $1+1}')

    # If we have passed a maximum number of trials, just exit with
    # a failed code.
    reachedmax=$(echo $counter \
         | awk '{if($1>'$maxcounter') print "yes"; else print "no";}')
    if [ x$reachedmax = xyes ]; then
        echo ""
	echo "Failed $maxcounter download attempts: $outname"
        echo ""
	exit 1
    fi

    # If this isn't the first attempt print a notice and wait a little for
    # the next trail.
    if [ x$counter = x1 ]; then
        just_a_place_holder=1
    else
        tstep=$(echo $counter | awk '{print $1*5}')
        echo "Download trial $counter for '$outname' in $tstep seconds."
        sleep $tstep
    fi

    # Attempt downloading the file. Note that the 'downloader' ends with
    # the respective option to specify the output name. For example "wget
    # -O" (so 'outname', that comes after it) will be the name of the
    # downloaded file.
    if [ x"$lockfile" = xnolock ]; then
        if ! $downloader $outname $inurl; then rm -f $outname; fi
    else
        # Try downloading from the requested URL.
        flock "$lockfile" sh -c \
              "if ! $downloader $outname \"$inurl\"; then rm -f $outname; fi"
    fi

    # If the download failed, try the backup server(s).
    if [ ! -f "$outname" ]; then
        if [ x"$backupservers" != x ]; then
            for bs in $backupservers; do

                # Use this backup server.
                if [ x"$lockfile" = xnolock ]; then
                    if ! $downloader $outname $bs/$urlfile; then rm -f $outname; fi
                else
                    flock "$lockfile" sh -c \
                          "if ! $downloader $outname $bs/$urlfile; then rm -f $outname; fi"
                fi

                # If the file was downloaded, break out of the loop that
                # parses over the backup servers.
                if [ -f "$outname" ]; then break; fi
            done
        fi
    fi
done





# Return successfully
exit 0

back to top

Software Heritage — Copyright (C) 2015–2026, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Content policy— Contact— JavaScript license information— Web API