File: repository_mirror

package info (click to toggle)
neuron 8.2.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 34,760 kB
  • sloc: cpp: 149,571; python: 58,465; ansic: 50,329; sh: 3,510; xml: 213; pascal: 51; makefile: 35; sed: 5
file content (168 lines) | stat: -rwxr-xr-x 4,949 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/env bash

#github master branch and bitbucket trunk branch mirror each other
# keep neuron.yale.edu up to date with respect to bitbucket

#list of repositories to mirror.
repositories="iv nrn"

#crontab -e
#0 */3 * * * /home/hines/neuron/repository_mirror/repository_mirror

# bitbucket and github settings have ssh keys to allow push without
# password.

# https://github.com/felipec/git-remote-hg software is used to make
# a git clone of the bitbucket hg repository using 'git clone hg::ssh:...'
# and track the remote origin/branches/trunk with the local branches/trunk.
# Also, the git repository on github has its remote git/master branch
# tracked by the local master branch.

# It is asserted that only one remote repository can be ahead of the local
# repository. If both are ahead, the merges must be done manually.
# If bitbucket is ahead of github, then the branches/trunk is (fast forward)
# merged to master and the latter is pushed to github.
# If github is ahead of bitbucket, then master is (fast forward) merged to
# branches/trunk and the latter is pushed to bitbucket.

# original bootstrapping requires a bitbucket hg repository and a
# github git repository with the same name (manually
# created from an earlier version of the hg repository). If the git
# repository is empty, this script will create a master branch and push

# an example of how to re-establish consistency when both hg and git
# repositories are different is
if false ; then
git clone http://github.com/nrnhines/nrn nrngit
hg clone http://bitbucket.org/nrnhines/nrn nrnhg
git clone hg::nrnhg temp

cd temp  

git fetch
git checkout -b branches/trunk origin/branches/trunk
git config core.notesRef refs/notes/hg

git remote add nrngit /home/hines/neuron/hggit/nrngit
git fetch nrngit

git checkout branches/trunk
git merge nrngit/master #and fix conflicts
git commit

git push origin
git checkout master
git merge branches/trunk
cd ../nrngit
git pull ../temp

fi

local=$HOME/neuron/hggit
hgmastersite=ssh://hg@bitbucket.org/nrnhines
gitmastersite=ssh://git@github.com/nrnhines
hgcopysite=ssh://hines@neuron.yale.edu//home/hg/neuron

mkdir -p $local
cd $local

for rep in $repositories ; do
  echo -e "\n\n\n${rep}\n"
  cd $local
  if test ! -d ${rep}hggit ; then
    git clone hg::$hgmastersite/${rep} ${rep}hggit
    cd ${rep}hggit
    git fetch
    git checkout -b branches/trunk origin/branches/trunk
    git config core.notesRef refs/notes/hg

    # is the github just initialized with no commits or can
    # its master be checked out
    git remote add git $gitmastersite/$rep
    if ! git fetch git ; then
      echo "$gitmastersite/$rep does not exist. Initialize it on github"
      exit 1
    fi
    if ! git checkout -b master git/master ; then
      echo "github empty so create master branch and push"
      git branch master
      git checkout master
      git push -u git master
    elif  test "`git status -b --porcelain`" != "## master...git/master" ; then
      echo "not on branch master...git/master"
      echo "$gitmastersite/$rep has no commits"
      exit 1
    fi
    echo "on branch master...git/master"
    cd ..
  fi

  cd ${rep}hggit

  # verify validity
  git branch --list -vv

  oldhg="`git log branches/trunk --format=\"%h\" -n 1`"
  oldgit="`git log master --format=\"%h\" -n 1`"

  git checkout branches/trunk
  git pull
  git checkout master
  git pull

  newhg="`git log branches/trunk --format=\"%h\" -n 1`"
  newgit="`git log master --format=\"%h\" -n 1`"

  echo oldhg $oldhg
  echo oldgit $oldgit
  echo newhg $newhg
  echo newgit $newgit

  if test "$newgit" != "$newhg" ; then
    # they are the different.
    # pull from the one ahead and push to the one behind.
    m2t=`git log -n 1 --format="%h" master..branches/trunk`
    t2m=`git log -n 1 --format="%h" branches/trunk..master`
    if test "$m2t" = "" ; then # empty means master ahead of trunk
      echo "merge $rep master to trunk and push to bitbucket"
      git checkout branches/trunk
      git merge master branches/trunk
      git push origin
    elif test "$t2m" = "" ; then
      echo "merge $rep trunk to master and push to github"
      git checkout master
      git merge branches/trunk master
      git push git
    else
      echo "Both github and bitbucket for $rep have changes. Resolve manually."
      continue
    fi
  fi

  cd $local
  # update neuron.yale.edu if necessary

  hgcopyid=`hg identify -i $hgcopysite/$rep`
  err=$?
  if test "$err" != 0 ; then # if the repository does not exist
    echo "$hgcopysite/$rep does not exist"
    continue
  fi

  hgmasterid=`hg identify -i $hgmastersite/$rep`
  if test "$hgmasterid" = "$hgcopyid" ; then
    continue
  fi

  if test ! -d "$local/${rep}hg" ; then
    echo "cloning bitbucket repository into the local ${rep}hg"
    hg clone $hgmastersite/$rep ${rep}hg
  fi

  echo $repname $hgmasterid $hgcopyid

  cd $local/${rep}hg
  hg pull -u
  hg push $hgcopysite/$rep

done