+
+sub pull () {
+ fetch();
+ runcmd qw(git merge -m),"Merge from $suite [dgit]",lref(uploadbranch());
+}
+
+sub dopush () {
+ runcmd qw(git diff --quiet HEAD);
+ my $clogp = parsechangelog();
+ $package = $clogp->{Source};
+ my $dscfn = "${package}_$clogp->{Version}.dsc";
+ stat $dscfn or die "$dscfn $!";
+ $dsc = parsecontrol("../$dscfn");
+ prep_ud();
+ chdir $ud or die $!;
+ print "checking that $dscfn corresponds to HEAD\n";
+ runcmd qw(dpkg-source -x --), "../../../../$dscfn";
+ my $tree = mktree_in_ud_from_only_subdir();
+ chdir '../../../..' or die $!;
+ runcmd qw(git diff --exit-code), $tree;
+#fetch from alioth
+#do fast forward check and maybe fake merge
+# if (!is_fast_fwd(mainbranch
+# runcmd qw(git fetch -p ), $alioth_git,
+# map { lref($_).":".rref($_) }
+# (uploadbranch());
+ $dsc->{$ourdscfield} = rev_parse('HEAD');
+ $dsc->save("../$dscfn.tmp") or die $!;
+ rename "../$dscfn.tmp","../$dscfn" or die "$dscfn $!";
+ if ($sign) {
+ runcmd qw(git tag -s),@git_tag_opts,qw(-m),
+ "Release $dsc->{Version} for $suite [dgit]";
+ unlink "../$dscfn.asc" or $!==&ENOENT or die "$dscfn.asc $!";
+ runcmd qw(gpg --clearsign),@gpg_opts,"../$dscfn";
+ rename "../$dscfn.asc","../$dscfn" or die "$dscfn $!";
+ }
+ if (!$nopush) {
+ runcmd qw(git push),$remotename,"HEAD:".lref(uploadbranch());
+ runcmd qw(dput),"../$dscfn";
+ }
+}
+
+sub cmd_clone {
+ if (@ARGV==1) {
+ ($package) = @ARGV;
+ } elsif (@ARGV==2) {
+ ($package,$suite) = @ARGV;
+ } else {
+ die;
+ }
+ clone();
+}
+
+sub branchsuite () {
+ $branch = `git-symbolic-ref HEAD`;
+ if ($branch =~ m#^refs/heads/dgit/([^/.]+)$#) {
+ return $1;
+ } else {
+ return undef;
+ }
+}
+
+sub cmd_fetch {
+ my $clogp = parsechangelog();
+ $package = $clogp->{Source};
+ if (@ARGV==0) {
+ $suite = branchsuite();
+ $suite ||= $clogp->{Distribution};
+ print "fetching from suite $suite\n";
+ } elsif (@ARGV==1) {
+ ($suite) = @ARGV;
+ } else {
+ die;
+ }
+ fetch();
+}
+
+sub cmd_push {
+ my $clogp = parsechangelog();
+ $package = $clogp->{Source};
+ if (@ARGV==0) {
+ $suite = $clogp->{Distribution};
+ } else {
+ die;
+ }
+ dopush();
+}
+
+sub parseopts () {
+ die if @ARGV && $ARGV[0] =~ m/^\-/;
+}
+
+parseopts();
+die unless @ARGV;
+my $cmd = shift @ARGV;
+parseopts();
+
+{ no strict qw(refs); &{"cmd_$cmd"}(); }