To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / extra / soundsoftware / update-external-repo.sh @ 736:51c97efbe241

History | View | Annotate | Download (4.75 KB)

1
#!/bin/sh
2

    
3
mirrordir="/var/mirror"
4
hg="/usr/local/bin/hg"
5

    
6
project="$1"
7
local_repo="$2"
8
remote_repo="$3"
9

    
10
if [ -z "$project" ] || [ -z "$local_repo" ] || [ -z "$remote_repo" ]; then
11
    echo "Usage: $0 <project> <local-repo-path> <remote-repo-url>"
12
    exit 2
13
fi
14

    
15
  # We need to handle different source repository types separately.
16
  # 
17
  # The convert extension cannot convert directly from a remote git
18
  # repo; we'd have to mirror to a local repo first.  Incremental
19
  # conversions do work though.  The hg-git plugin will convert
20
  # directly from remote repositories, but not via all schemes
21
  # (e.g. https is not currently supported).  It's probably easier to
22
  # use git itself to clone locally and then convert or hg-git from
23
  # there.
24
  # 
25
  # We can of course convert directly from remote Subversion repos,
26
  # but we need to keep track of that -- you can ask to convert into a
27
  # repo that has already been used (for Mercurial) and it'll do so
28
  # happily; we don't want that.
29
  #
30
  # Converting from a remote Hg repo should be fine!
31
  #
32
  # One other thing -- we can't actually tell the difference between
33
  # the various SCM types based on URL alone.  We have to try them
34
  # (ideally in an order determined by a guess based on the URL) and
35
  # see what happens.
36

    
37
project_mirror="$mirrordir/$project"
38
mkdir -p "$project_mirror"
39
project_repo_mirror="$project_mirror/repo"
40

    
41
  # Some test URLs:
42
  # 
43
  # http://aimc.googlecode.com/svn/trunk/
44
  # http://aimc.googlecode.com/svn/
45
  # http://vagar.org/git/flam
46
  # https://github.com/wslihgt/IMMF0salience.git
47
  # http://hg.breakfastquay.com/dssi-vst/
48
  # git://github.com/schacon/hg-git.git
49
  # http://svn.drobilla.net/lad (externals!)
50

    
51
# If we are importing from another distributed system, then our aim is
52
# to create either a Hg repo or a git repo at $project_mirror, which
53
# we can then pull from directly to the Hg repo at $local_repo (using
54
# hg-git, in the case of a git repo).
55

    
56
# Importing from SVN, we should use hg convert directly to the target
57
# hg repo (or should we?) but keep a record of the last changeset ID
58
# we brought in, and test each time whether it matches the last
59
# changeset ID actually in the repo
60

    
61
success=""
62

    
63
# If we have a record of the last successfully updated remote repo
64
# URL, check it against our current remote URL: if it has changed, we
65
# will need to start again with a new clone rather than pulling
66
# updates into the existing local mirror
67

    
68
successfile="$project_mirror/last_successful_url"
69
if [ -f "$successfile" ]; then
70
    last=$(cat "$successfile")
71
    if [ x"$last" = x"$remote_repo" ]; then
72
	echo "$$: Remote URL is unchanged from last successful update"
73
    else
74
	echo "$$: Remote URL has changed since last successful update:"
75
	echo "$$: Last URL was $last, current is $remote_repo"
76
	suffix="$$.$(date +%s)"
77
	echo "$$: Moving existing repos to $suffix suffix and starting afresh"
78
	mv "$project_repo_mirror" "$project_repo_mirror"."$suffix"
79
	mv "$local_repo" "$local_repo"."$suffix"
80
	mv "$successfile" "$successfile"."$suffix"
81
	touch "$project_mirror/url_changed"
82
    fi
83
fi
84

    
85
if [ -d "$project_repo_mirror" ]; then
86

    
87
    # Repo mirror exists: update it
88
    echo "$$: Mirror for project $project exists at $project_repo_mirror, updating" 1>&2
89

    
90
    if [ -d "$project_repo_mirror/.hg" ]; then
91
	"$hg" --config extensions.convert= convert --datesort "$remote_repo" "$project_repo_mirror" && success=true
92
	if [ -z "$success" ]; then
93
	    ( cd "$project_repo_mirror" && "$hg" pull "$remote_repo" ) && success=true
94
	fi
95
    elif [ -d "$project_repo_mirror/.git" ]; then
96
	( cd "$project_repo_mirror" && git pull "$remote_repo" master ) && success=true
97
    else 
98
	echo "$$: ERROR: Repo mirror dir $project_repo_mirror exists but is not an Hg or git repo" 1>&2
99
    fi
100

    
101
else
102

    
103
    # Repo mirror does not exist yet
104
    echo "$$: Mirror for project $project does not yet exist at $project_repo_mirror, trying to convert or clone" 1>&2
105

    
106
    case "$remote_repo" in
107
	*git*) 
108
	    git clone "$remote_repo" "$project_repo_mirror" ||
109
	    "$hg" --config extensions.convert= convert --datesort "$remote_repo" "$project_repo_mirror"
110
	    ;;
111
	*)
112
	    "$hg" --config extensions.convert= convert --datesort "$remote_repo" "$project_repo_mirror" ||
113
	    git clone "$remote_repo" "$project_repo_mirror" ||
114
	    "$hg" clone "$remote_repo" "$project_repo_mirror"
115
	    ;;
116
    esac && success=true
117

    
118
fi
119
	
120
echo "Success=$success"
121

    
122
if [ -n "$success" ]; then
123
    echo "$$: Update successful, pulling into local repo at $local_repo"
124
    if [ ! -d "$local_repo" ]; then
125
	"$hg" init "$local_repo"
126
    fi
127
    if [ -d "$project_repo_mirror/.git" ]; then
128
	( cd "$local_repo" && "$hg" --config extensions.hggit= pull "$project_repo_mirror" ) && echo "$remote_repo" > "$successfile"
129
    else 
130
	( cd "$local_repo" && "$hg" pull "$project_repo_mirror" ) && echo "$remote_repo" > "$successfile"
131
    fi
132
fi