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 if __name__
=='__main__':
58 sys
.stderr
.write('Error: No option %s given\n' % opt
)
64 parser
.add_option("--marks",dest
="marksfile",
65 help="File to read git-fast-import's marks from")
66 parser
.add_option("--heads",dest
="headsfile",
67 help="File to read last run's git heads from")
68 parser
.add_option("--status",dest
="statusfile",
69 help="File to read status from")
70 parser
.add_option("-r","--repo",dest
="repourl",
71 help="URL of repo to import")
72 parser
.add_option("-R","--revision",type=int,dest
="revision",
73 help="Revision to reset to")
75 (options
,args
)=parser
.parse_args()
77 if options
.marksfile
==None: bail(parser
,'--marks option')
78 if options
.headsfile
==None: bail(parser
,'--heads option')
79 if options
.statusfile
==None: bail(parser
,'--status option')
80 if options
.repourl
==None: bail(parser
,'--repo option')
81 if options
.revision
==None: bail(parser
,'-R/--revision')
83 heads_cache
=load_cache(options
.headsfile
)
84 marks_cache
=load_cache(options
.marksfile
)
85 state_cache
=load_cache(options
.statusfile
)
87 l
=int(state_cache
.get('tip',options
.revision
))
88 if options
.revision
+1>l
:
89 sys
.stderr
.write('Revision is beyond last revision imported: %d>%d\n' % (options
.revision
,l
))
92 ui
,repo
=setup_repo(options
.repourl
)
93 stale
,changed
,unchanged
=get_branches(ui
,repo
,heads_cache
,marks_cache
,options
.revision
+1)
95 print "Possibly stale branches:"
96 map(lambda b
: sys
.stdout
.write('\t%s\n' % b
),stale
.keys())
98 print "Unchanged branches:"
99 map(lambda b
: sys
.stdout
.write('\t%s (r%s)\n' % (b
[0],b
[2])),unchanged
)
101 print "Reset branches in '%s' to:" % options
.headsfile
102 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
)
104 print "Reset ':tip' in '%s' to '%d'" % (options
.statusfile
,options
.revision
)