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 / fast-export / hg-fast-export.sh @ 1570:ae2f71010562

History | View | Annotate | Download (4.37 KB)

1
#!/bin/sh
2

    
3
# Copyright (c) 2007, 2008 Rocco Rutte <pdmef@gmx.net> and others.
4
# License: MIT <http://www.opensource.org/licenses/mit-license.php>
5

    
6
ROOT="$(dirname "$(which "$0")")"
7
REPO=""
8
PFX="hg2git"
9
SFX_MAPPING="mapping"
10
SFX_MARKS="marks"
11
SFX_HEADS="heads"
12
SFX_STATE="state"
13
GFI_OPTS=""
14
PYTHON=${PYTHON:-python}
15

    
16
USAGE="[--quiet] [-r <repo>] [--force] [-m <max>] [-s] [--hgtags] [-A <file>] [-B <file>] [-T <file>] [-M <name>] [-o <name>] [--hg-hash] [-e <encoding>]"
17
LONG_USAGE="Import hg repository <repo> up to either tip or <max>
18
If <repo> is omitted, use last hg repository as obtained from state file,
19
GIT_DIR/$PFX-$SFX_STATE by default.
20

    
21
Note: The argument order matters.
22

    
23
Options:
24
	--quiet   Passed to git-fast-import(1)
25
	-r <repo> Mercurial repository to import
26
	--force   Ignore validation errors when converting, and pass --force
27
	          to git-fast-import(1)
28
	-m <max>  Maximum revision to import
29
	-s        Enable parsing Signed-off-by lines
30
	--hgtags  Enable exporting .hgtags files
31
	-A <file> Read author map from file
32
	          (Same as in git-svnimport(1) and git-cvsimport(1))
33
	-B <file> Read branch map from file
34
	-T <file> Read tags map from file
35
	-M <name> Set the default branch name (defaults to 'master')
36
	-o <name> Use <name> as branch namespace to track upstream (eg 'origin')
37
	--hg-hash Annotate commits with the hg hash as git notes in the
38
                  hg namespace.
39
	-e <encoding> Assume commit and author strings retrieved from 
40
	              Mercurial are encoded in <encoding>
41
	--fe <filename_encoding> Assume filenames from Mercurial are encoded 
42
	                         in <filename_encoding>
43
"
44
case "$1" in
45
    -h|--help)
46
      echo "usage: $(basename "$0") $USAGE"
47
      echo ""
48
      echo "$LONG_USAGE"
49
      exit 0
50
esac
51

    
52
IS_BARE=$(git rev-parse --is-bare-repository) \
53
    || (echo "Could not find git repo" ; exit 1)
54
if test "z$IS_BARE" != ztrue; then
55
   # This is not a bare repo, cd to the toplevel
56
   TOPLEVEL=$(git rev-parse --show-toplevel) \
57
       || (echo "Could not find git repo toplevel" ; exit 1)
58
   cd $TOPLEVEL || exit 1
59
fi
60
GIT_DIR=$(git rev-parse --git-dir) || (echo "Could not find git repo" ; exit 1)
61

    
62
while case "$#" in 0) break ;; esac
63
do
64
  case "$1" in
65
    -r|--r|--re|--rep|--repo)
66
      shift
67
      REPO="$1"
68
      ;;
69
    --q|--qu|--qui|--quie|--quiet)
70
      GFI_OPTS="$GFI_OPTS --quiet"
71
      ;;
72
    --force)
73
      # pass --force to git-fast-import and hg-fast-export.py
74
      GFI_OPTS="$GFI_OPTS --force"
75
      break
76
      ;;
77
    -*)
78
      # pass any other options down to hg2git.py
79
      break
80
      ;;
81
    *)
82
      break
83
      ;;
84
  esac
85
  shift
86
done
87

    
88
# for convenience: get default repo from state file
89
if [ x"$REPO" = x -a -f "$GIT_DIR/$PFX-$SFX_STATE" ] ; then
90
  REPO="`grep '^:repo ' "$GIT_DIR/$PFX-$SFX_STATE" | cut -d ' ' -f 2`"
91
  echo "Using last hg repository \"$REPO\""
92
fi
93

    
94
if [  -z "$REPO" ]; then
95
    echo "no repo given, use -r flag"
96
    exit 1
97
fi
98

    
99
# make sure we have a marks cache
100
if [ ! -f "$GIT_DIR/$PFX-$SFX_MARKS" ] ; then
101
  touch "$GIT_DIR/$PFX-$SFX_MARKS"
102
fi
103

    
104
# cleanup on exit
105
trap 'rm -f "$GIT_DIR/$PFX-$SFX_MARKS.old" "$GIT_DIR/$PFX-$SFX_MARKS.tmp"' 0
106

    
107
_err1=
108
_err2=
109
exec 3>&1
110
{ read -r _err1 || :; read -r _err2 || :; } <<-EOT
111
$(
112
  exec 4>&3 3>&1 1>&4 4>&-
113
  {
114
    _e1=0
115
    GIT_DIR="$GIT_DIR" $PYTHON "$ROOT/hg-fast-export.py" \
116
      --repo "$REPO" \
117
      --marks "$GIT_DIR/$PFX-$SFX_MARKS" \
118
      --mapping "$GIT_DIR/$PFX-$SFX_MAPPING" \
119
      --heads "$GIT_DIR/$PFX-$SFX_HEADS" \
120
      --status "$GIT_DIR/$PFX-$SFX_STATE" \
121
      "$@" 3>&- || _e1=$?
122
    echo $_e1 >&3
123
  } | \
124
  {
125
    _e2=0
126
    git fast-import $GFI_OPTS --export-marks="$GIT_DIR/$PFX-$SFX_MARKS.tmp" 3>&- || _e2=$?
127
    echo $_e2 >&3
128
  }
129
)
130
EOT
131
exec 3>&-
132
[ "$_err1" = 0 -a "$_err2" = 0 ] || exit 1
133

    
134
# move recent marks cache out of the way...
135
if [ -f "$GIT_DIR/$PFX-$SFX_MARKS" ] ; then
136
  mv "$GIT_DIR/$PFX-$SFX_MARKS" "$GIT_DIR/$PFX-$SFX_MARKS.old"
137
else
138
  touch "$GIT_DIR/$PFX-$SFX_MARKS.old"
139
fi
140

    
141
# ...to create a new merged one
142
cat "$GIT_DIR/$PFX-$SFX_MARKS.old" "$GIT_DIR/$PFX-$SFX_MARKS.tmp" \
143
| uniq > "$GIT_DIR/$PFX-$SFX_MARKS"
144

    
145
# save SHA1s of current heads for incremental imports
146
# and connectivity (plus sanity checking)
147
for head in `git branch | sed 's#^..##'` ; do
148
  id="`git rev-parse refs/heads/$head`"
149
  echo ":$head $id"
150
done > "$GIT_DIR/$PFX-$SFX_HEADS"
151

    
152
# check diff with color:
153
# ( for i in `find . -type f | grep -v '\.git'` ; do diff -u $i $REPO/$i ; done | cdiff ) | less -r