diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-03-29 05:58:58 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-03-29 05:58:58 -0300 |
commit | 69357393e580dbcd400c7c1992b48813359eb417 (patch) | |
tree | 27c962a692da9c36cdaa85814eddf5f833ffd777 /v4l | |
parent | c1320d2c77e66cf93a7b899cf3764a556c5bc3f9 (diff) | |
parent | dd151ee816f6d89d08edda36da27880b88c32fae (diff) | |
download | mediapointer-dvb-s2-69357393e580dbcd400c7c1992b48813359eb417.tar.gz mediapointer-dvb-s2-69357393e580dbcd400c7c1992b48813359eb417.tar.bz2 |
merge: http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-bttv
From: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'v4l')
-rw-r--r-- | v4l/Makefile | 3 | ||||
-rwxr-xr-x | v4l/scripts/do_merge.pl | 175 |
2 files changed, 177 insertions, 1 deletions
diff --git a/v4l/Makefile b/v4l/Makefile index 9d194178f..a5201f31b 100644 --- a/v4l/Makefile +++ b/v4l/Makefile @@ -240,7 +240,8 @@ ifneq ($(DIR),) -e ' elsif (/^PATCHLEVEL\s*=\s*(\d+)/){ $$level=$$1; }' \ -e ' elsif (/^SUBLEVEL\s*=\s*(\d+)/){ $$sublevel=$$1; }' \ -e ' elsif (/^EXTRAVERSION\s*=\s*(\S+)\n/){ $$extra=$$1; }' \ - -e ' elsif (/^KERNELSRC\s*:=\s*(\S.*)\n/){ $$o=$$d; $$d=$$1; goto S; }' \ + -e ' elsif (/^KERNELSRC\s*:=\s*(\S.*)\n/ || /^MAKEARGS\s*:=\s*-C\s*(\S.*)\n/)' \ + -e ' { $$o=$$d; $$d=$$1; goto S; }' \ -e '};' \ -e 'printf ("VERSION=%s\nPATCHLEVEL:=%s\nSUBLEVEL:=%s\nKERNELRELEASE:=%s.%s.%s%s\n",' \ -e ' $$version,$$level,$$sublevel,$$version,$$level,$$sublevel,$$extra);' \ diff --git a/v4l/scripts/do_merge.pl b/v4l/scripts/do_merge.pl new file mode 100755 index 000000000..0a4433a21 --- /dev/null +++ b/v4l/scripts/do_merge.pl @@ -0,0 +1,175 @@ +#!/usr/bin/perl + +my $merge_tree=shift or die "Should specify the pulled tree"; + +sub hgrcuser($) +{ + my $file = shift; + my $ui = 0; + open IN, '<', $file; + while (<IN>) { + $ui = 1 if (/^\s*\[ui\]/); + if ($ui && /^\s*username\s*=\s*(\S.*?)\s*$/) { + close IN; + return($1); + } + } + close IN; + return(""); +} + +sub check_heads() +{ + my $count=0; + open IN, 'hg heads|'; + while (<IN>) { + if (m/^[Cc]hangeset:/) { + $count++; + } + } + close IN; + return $count; +} + +sub curr_changeset() +{ + my $changeset = -1; + + open IN, 'hg heads|'; + while (<IN>) { + if (m/^[Cc]hangeset:\s*(\d+)/) { + if ($changeset < 0) { + $changeset = $1; + } else { + if ($1 < $changeset) { + $changeset = $1; + } + } + } + } + close IN; + return $changeset; +} + +sub check_status() +{ + my $count=0; + open IN, 'hg status -m -a -d -r|'; + while (<IN>) { + $count++; + } + close IN; + return $count; +} + +sub rollback() +{ + print "Rolling back hg pull $merge_tree\n"; + system("hg rollback"); + system("hg update -C"); + exit -1; +} + +#################### +# Determine username + +# Get Hg username from environment +my $user = $ENV{HGUSER}; + +# Didn't work? Try the repo's .hgrc file +if ($user eq "") { + my $hgroot = `hg root`; + chomp($hgroot); + $user = hgrcuser("$hgroot/.hg/hgrc"); +} +# Ok, try ~/.hgrc next +if ($user eq "") { + $user = hgrcuser("$ENV{HOME}/.hgrc"); +} + +# Still no luck? Try some other environment variables +if ($user eq "") { + my $name = $ENV{CHANGE_LOG_NAME}; + my $email = $ENV{CHANGE_LOG_EMAIL_ADDRESS}; + $user = "$name <$email>" if ($name ne "" || $email ne ""); +} + +# Last try to come up with something +if ($user eq "") { + print "User not known. Can't procceed\n"; + exit -1; +} + +###################### +# Do some sanity tests + +print "Checking if everything is ok, before applying the new tree.\n"; + +my $n_heads = check_heads(); +die "Your tree currently have more than one head (it has $n_heads heads). Can't procceed\n" if ($n_heads > 1); + +my $dirty = check_status(); +die "Your tree currently has changes. Can't procceed\n" if ($dirty); + +my $curr_cs = curr_changeset(); + +########### +# Pull tree + +print "hg pull $merge_tree\n"; + +my $ret = system("hg pull $merge_tree"); +die "Couldn't pull from $merge_tree\n" if ($ret); + +############################# +# Merge and commit, if needed + +$n_heads = check_heads(); +if ($n_heads > 2) { + print "The merged tree have more than one head (it has $n_heads heads). Can't procceed.\n"; + rollback(); +} + +if ($n_heads == 2) { + print "Merging the new changesets\n"; + + $ret = system("hg merge"); + if ($ret) { + print "hg merge failed. Can't procceed.\n"; + rollback(); + } + + print "Committing the new tree\n"; + # Write the commit message + $msg= "merge: $merge_tree\n\nFrom: $user\n\nSigned-off-by: $user\n"; + $ret=system("hg commit -m '$msg'"); + if ($ret) { + print "hg commit failed. Can't procceed.\n"; + rollback(); + } +} + +##################### +# Test resulting tree + +print "Testing if the build didn't break compilation. Only errors and warnings will be displayed. Please wait.\n"; +$ret = system ('make all|egrep -v "^\s*CC"|egrep -v "^\s*LD"'); +if ($ret) { + print "Build failed. Can't procceed.\n"; + + # To avoid the risk of doing something really bad, let's ask the user to run hg strip + print "Your tree is dirty. Since hg has only one rollback level, you'll need to use, instead:"; + print "\thg strip $curr_cs; hg update -C"; + print "You'll need to have hg mq extension enabled for hg strip to work.\n"; + + exit -1; +} + +############################## +# Everything is ok, let's push + +print "Pushing the new tree at the remote repository specified at .hg/hgrc\n"; +$ret=system ("hg push"); +if ($ret) { + print "hg push failed. Don't forget to do the push later.\n"; +} |