3 # Copyright (c) 2007 Rocco Rutte <pdmef@gmx.net>
6 from mercurial
import repo
,hg
,cmdutil
,util
,ui
,revlog
,node
7 from hg2git
import setup_repo
,load_cache
,get_changeset
,get_git_sha1
8 from optparse
import OptionParser
11 def heads(ui
,repo
,start
=None,stop
=None,max=None):
12 # this is copied from mercurial/revlog.py and differs only in
13 # accepting a max argument for xrange(startrev+1,...) defaulting
14 # to the original repo.changelog.count()
20 max = repo
.changelog
.count()
21 stoprevs
= dict.fromkeys([repo
.changelog
.rev(n
) for n
in stop
])
22 startrev
= repo
.changelog
.rev(start
)
23 reachable
= {startrev
: 1}
26 parentrevs
= repo
.changelog
.parentrevs
27 for r
in xrange(startrev
+ 1, max):
28 for p
in parentrevs(r
):
33 if p
in heads
and p
not in stoprevs
:
36 return [(repo
.changelog
.node(r
),str(r
)) for r
in heads
]
38 def get_branches(ui
,repo
,heads_cache
,marks_cache
,max):
39 h
=heads(ui
,repo
,max=max)
40 stale
=dict.fromkeys(heads_cache
)
44 _
,_
,user
,(_
,_
),_
,desc
,branch
,_
=get_changeset(ui
,repo
,rev
)
46 git_sha1
=get_git_sha1(branch
)
47 cache_sha1
=marks_cache
.get(str(int(rev
)+1))
48 if git_sha1
!=None and git_sha1
==cache_sha1
:
49 unchanged
.append([branch
,cache_sha1
,rev
,desc
.split('\n')[0],user
])
51 changed
.append([branch
,cache_sha1
,rev
,desc
.split('\n')[0],user
])
54 return stale
,changed
,unchanged
56 def get_tags(ui
,repo
,marks_cache
,max):
60 if tag
=='tip': continue
61 rev
=repo
.changelog
.rev(node
)
62 cache_sha1
=marks_cache
.get(str(int(rev
)+1))
63 _
,_
,user
,(_
,_
),_
,desc
,branch
,_
=get_changeset(ui
,repo
,rev
)
65 bad
.append([tag
,branch
,cache_sha1
,rev
,desc
.split('\n')[0],user
])
67 good
.append([tag
,branch
,cache_sha1
,rev
,desc
.split('\n')[0],user
])
72 if __name__
=='__main__':
74 sys
.stderr
.write('Error: No option %s given\n' % opt
)
80 parser
.add_option("--marks",dest
="marksfile",
81 help="File to read git-fast-import's marks from")
82 parser
.add_option("--heads",dest
="headsfile",
83 help="File to read last run's git heads from")
84 parser
.add_option("--status",dest
="statusfile",
85 help="File to read status from")
86 parser
.add_option("-r","--repo",dest
="repourl",
87 help="URL of repo to import")
88 parser
.add_option("-R","--revision",type=int,dest
="revision",
89 help="Revision to reset to")
91 (options
,args
)=parser
.parse_args()
93 if options
.marksfile
==None: bail(parser
,'--marks option')
94 if options
.headsfile
==None: bail(parser
,'--heads option')
95 if options
.statusfile
==None: bail(parser
,'--status option')
96 if options
.repourl
==None: bail(parser
,'--repo option')
97 if options
.revision
==None: bail(parser
,'-R/--revision')
99 heads_cache
=load_cache(options
.headsfile
)
100 marks_cache
=load_cache(options
.marksfile
)
101 state_cache
=load_cache(options
.statusfile
)
103 l
=int(state_cache
.get('tip',options
.revision
))
104 if options
.revision
+1>l
:
105 sys
.stderr
.write('Revision is beyond last revision imported: %d>%d\n' % (options
.revision
,l
))
108 ui
,repo
=setup_repo(options
.repourl
)
110 stale
,changed
,unchanged
=get_branches(ui
,repo
,heads_cache
,marks_cache
,options
.revision
+1)
111 good
,bad
=get_tags(ui
,repo
,marks_cache
,options
.revision
+1)
113 print "Possibly stale branches:"
114 map(lambda b
: sys
.stdout
.write('\t%s\n' % b
),stale
.keys())
116 print "Possibly stale tags:"
117 map(lambda b
: sys
.stdout
.write('\t%s on %s (r%s)\n' % (b
[0],b
[1],b
[3])),bad
)
119 print "Unchanged branches:"
120 map(lambda b
: sys
.stdout
.write('\t%s (r%s)\n' % (b
[0],b
[2])),unchanged
)
122 print "Unchanged tags:"
123 map(lambda b
: sys
.stdout
.write('\t%s on %s (r%s)\n' % (b
[0],b
[1],b
[3])),good
)
125 print "Reset branches in '%s' to:" % options
.headsfile
126 map(lambda b
: sys
.stdout
.write('\t:%s %s\n\t\t(r%s: %s: %s)\n' % (b
[0],b
[1],b
[2],b
[4],b
[3])),changed
)
128 print "Reset ':tip' in '%s' to '%d'" % (options
.statusfile
,options
.revision
)