|  | #!/usr/bin/perl | 
|  | # Copyright 2004 - Ryan Anderson <ryan@michonline.com>  GPL v2 | 
|  |  | 
|  | use strict; | 
|  | use warnings; | 
|  | use Digest::MD5; | 
|  | require 5.006; | 
|  |  | 
|  | if (@ARGV != 1) { | 
|  | print <<EOT; | 
|  | Usage: setlocalversion <srctree> | 
|  | EOT | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | my ($srctree) = @ARGV; | 
|  | chdir($srctree); | 
|  |  | 
|  | my @LOCALVERSIONS = (); | 
|  |  | 
|  | # We are going to use the following commands to try and determine if this | 
|  | # repository is at a Version boundary (i.e, 2.6.10 vs 2.6.10 + some patches) We | 
|  | # currently assume that all meaningful version boundaries are marked by a tag. | 
|  | # We don't care what the tag is, just that something exists. | 
|  |  | 
|  | # Git/Cogito store the top-of-tree "commit" in .git/HEAD | 
|  | # A list of known tags sits in .git/refs/tags/ | 
|  | # | 
|  | # The simple trick here is to just compare the two of these, and if we get a | 
|  | # match, return nothing, otherwise, return a subset of the SHA-1 hash in | 
|  | # .git/HEAD | 
|  |  | 
|  | sub do_git_checks { | 
|  | open(H,"<.git/HEAD") or return; | 
|  | my $head = <H>; | 
|  | chomp $head; | 
|  | close(H); | 
|  |  | 
|  | opendir(D,".git/refs/tags") or return; | 
|  | foreach my $tagfile (grep !/^\.{1,2}$/, readdir(D)) { | 
|  | open(F,"<.git/refs/tags/" . $tagfile) or return; | 
|  | my $tag = <F>; | 
|  | chomp $tag; | 
|  | close(F); | 
|  | return if ($tag eq $head); | 
|  | } | 
|  | closedir(D); | 
|  |  | 
|  | push @LOCALVERSIONS, "g" . substr($head,0,8); | 
|  | } | 
|  |  | 
|  | if ( -d ".git") { | 
|  | do_git_checks(); | 
|  | } | 
|  |  | 
|  | printf "-%s\n", join("-",@LOCALVERSIONS) if (scalar @LOCALVERSIONS > 0); |